Builder 3D Mono – Heated bed controller met Arduino
Builder Heated Bed controller met Arduino
Mankement:
Mijn heated bed controller functioneerde niet meer goed na een kortsluiting van de power plugs, lees meer hier.
Oorzaak:
Niet bekend, er staat nu constant 24V op de uitgang zekering was goed, een van de regulators kapot?
Oplossing:
Kan wel heel veel tijd gaan besteden aan het uitzoeken en repararen, maar ik dacht wellicht kan het beter én efficiënter!
Ik dacht hierbij aan de werking van een RAMPS 1.4 heated bed regeling, dat is:
- Verwarmen tot een bepaalde temperatuur
- stoppen (afkoelen) hysteresis voor het afkoelen meenemen.
- Weer verwarmen
- etc.
Ik heb 2 Dallas DS18B20 sensoren gebruikt (1 extra voor failsafe) en op de plaat gemonteerd, op de Arduino UNO heb ik een LCD Shield gebruikt
Lijst van materialen:
- 1x Arduino UNO
- 1x Arduino LCD shield
- 2x Dallas DS18B20 temperatuur sensoren
- 1x Powerplug male
- 2x Powerplug female
- Snoeren en draad/dupont jumpwires
Op deze manier is het:
- Zuiniger, omdat met de conventionele controller door Builder 3D meegeleverd heel veel energie in de dissipatie van warmte van de transistors gaat zitten, in dit geval is dat niet meer!
- Sneller warm, de plaat warmt sneller op, doordat het volle vermogen er op komt!
- Digitaal regelbaar, de temperatuur is in te stellen!
- Efficiënter, in de nieuwe Arduino regeling is een timer ingebouwd (instelbaar), de hitteplaat schakelt nu na x minuten af, de hitteplaat is immers alleen nodig voor de eerste lagen!
Plaatsen van de temperatuur sensoren:
Programmeren en aansluiten van de Arduino:
Programmeren met een afschakel timer:
De arduino code
Hieronder vind je de Arduino code die ik voor deze regeling gemaakt heb.
Ps. vergeet niet de CONFIGURATIE aan te passen naar wens!
- Met up/down kan je de temperatuur instellen.
- Met left/right kan je de timer instellen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
// Arduino code voor het regelen van een heated bed d.m.v. 2 DALLAS DS18B20 sensoren. // Toegepast voor Builder 3D heated bed, door Sebastiaan Ebeltjes, Deventer. // Versie 1.1.0 // // Changelog: // - Buzzer toegevoegd als alarm. // - Meerdere variabelen in te stellen. // - Code cleanup, onnodige variabelen eruit gehaald, andere hermoemd. // - De hoogste waarde van beide sensoren bepaalt het schakelen. #include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> //CONFIGURATIE #define ONE_WIRE_BUS 2 // Datapin van de DALLAS sensoren. int relais_pin = 3; // Pin waarop het relais is aangesloten. int buzzer_pin = 11; // Pin waarop de buzzer is aangesloten. int temp = 55; // Temperatuur instelling. int tempmax = 70; // Max. Temperatuur. int tempmin = 30; // Min. Temperatuur. int temphys = 3; // Hysteresis in graden (voorkomt snelle vibratie in schakelingen), ook voor alarm wanneer t > tmax. int shutdown_mins = 90; // Schakelt uit na x minuten, hitteplaat is alleen nodig voor de eerste lagen. int tempstap = 5; // Temperatuur stappen in graden. int tijdstap = 10; // Tijd stappen in minuten. //CONFIGURATIE int shutdwn = 0; int x = 0; int currx = 1023; int verstreken_tijd_min; unsigned long StartTime = millis(); // Start de timer. OneWire oneWire(ONE_WIRE_BUS); // oneWire instance. DallasTemperature sensors(&oneWire); // geef oneWire referentie naar Dallas Temperatuur variabele. LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Initialiseer de display biblitoheek met de pin nummers. void setup() { pinMode(relais_pin, OUTPUT); pinMode(buzzer_pin, OUTPUT); digitalWrite(relais_pin, HIGH); // Relais UIT. lcd.begin(16, 2); // Stel de LCD in met kolommen en rijen. lcd.clear(); lcd.setCursor(0,0); lcd.print("T1: TBED:"); lcd.setCursor(0,1); lcd.print("T2: UIT:"); lcd.setCursor(14,0); lcd.print(temp); lcd.setCursor(13,1); lcd.print(shutdown_mins); // Deze 2 regels zijn nodig omdat het intialiseren van de sensoren begint op 85 graden, anders triggert dit het alarm. sensors.requestTemperatures(); delay(500); } void loop() { x = analogRead(A0); // Lees de drukknop waarden uit vanaf de analog0 pin. if ((x != 1023) && (x != currx)){ // Kijk of x veranderd is. currx = x; if (currx > 700 && currx < 750){ // SELECT } else if (currx > 450 && currx < 550){ shutdown_mins = shutdown_mins - tijdstap; if (shutdown_mins < 10) {shutdown_mins = 10;} } else if (currx < 10){ shutdown_mins = shutdown_mins + tijdstap; if (shutdown_mins > 180) {shutdown_mins = 180;} } else if (currx > 100 && currx < 200){ temp = temp + tempstap; if (temp > tempmax) {temp = tempmax;} } else if (currx > 250 && currx < 350){ temp = temp - tempstap; if (temp < tempmin) {temp = tempmin;} } // Er is op een knop gedrukt, update display temperatuur en tijd. lcd.setCursor(14,0); lcd.print(temp); lcd.setCursor(13,1); lcd.print(" "); // Nodig om van 3 naar 2 decimalen te gaan. lcd.setCursor(13,1); lcd.print(shutdown_mins - verstreken_tijd_min); } sensors.requestTemperatures(); // Stuur het commando om de temperaturen op te halen van alle sensoren in de bus. long temp1 = sensors.getTempCByIndex(0); long temp2 = sensors.getTempCByIndex(1); // Print gegevens naar het lcd scherm. lcd.setCursor(3,0); lcd.print(sensors.getTempCByIndex(0)); lcd.print(" TBED:"); // Nodig omdat soms 00 verschijnen. lcd.setCursor(3,1); lcd.print(sensors.getTempCByIndex(1)); lcd.print(" UIT:"); // Nodig omdat soms 00 verschijnen. // Tijd printen naar display. unsigned long CurrentTime = millis(); unsigned long ElapsedTime = CurrentTime - StartTime; verstreken_tijd_min = ElapsedTime/60000; lcd.setCursor(13,1); lcd.print(" "); // Nodig om van 3 naar 2 decimalen te gaan. lcd.setCursor(13,1); lcd.print(shutdown_mins - verstreken_tijd_min); // Heated bed schakelen? if (shutdwn == 0) { if (temp1 >= temp && temp2 >= temp) { digitalWrite(relais_pin, HIGH); // Relais UIT. //digitalWrite(buzzer_pin, HIGH); // Relais UIT. } if (temp1 < (temp - temphys) && temp2 < (temp - temphys)) { digitalWrite(relais_pin, LOW); // Relais AAN. } } // Alarm wanneer temperatuursensoren niet goed werken! if (shutdwn == 0) { if (temp1 >= (tempmax + temphys) || temp2 >= (tempmax + temphys)) { digitalWrite(relais_pin, HIGH); // Relais UIT lcd.setCursor(0,0); lcd.print(" !!ALARM!! "); lcd.setCursor(0,1); lcd.print(" !!ALARM!! "); while(1) { // oneindige loop. digitalWrite(buzzer_pin, HIGH); // Buzzer AAN. delay(400); digitalWrite(buzzer_pin, LOW); // Buzzer UIT. delay(400); } } } // Uitschakelen heated bed? if (shutdown_mins - verstreken_tijd_min < 1) { shutdwn = 1; digitalWrite(relais_pin, HIGH); // Relais UIT lcd.setCursor(13,1); lcd.print(" OK"); } } |
[#/3dprinter/builder3dmono/heated_bed_regeling_arduino” ]