Hi!
Langzamerhand begint het een beetje vorm te krijgen...
Dan heb ik het over hoe ik mijn dubbele oven wil gaan uitvoeren wat het aansturen van de oven betreft.
Om nu wat ervaring op te doen met de tijdconstanten die aanwezig zijn wou ik eerst simpel beginnen en heb besloten een 50-Watt weerstand te gaan gebruiken als "testoven".
Dit is een plaatje van de sensoren die ik op de weerstand heb gemonteerd.
De linker sensor is een TMP37 van Analog Devices en geeft 20mV/C,
dit samen met de Arduino interne referentie van bij mij 1,0734V geeft een bitwaarde van iets meer dan 1mV.
Wat weer resulteerd in een resolutie van 0,02C.
De rechter sensor is een precisie NTC van 5K, deze gebruik ik omdat de KeySight 34461A multimeter die direct in C kan weergeven en ook grafiekjes kan schrijven.
Hierdoor kan ik hopelijk zien hoe goed de regeling gaat worden.
Dit is de testsetup, een mooi groen display, met hierop wat waarden en die zal ik even uitleggen.
Linksboven op de eerste regel is de ruwe bitwaarde van de analoge innput die ik gebruik voor de TMP37 sensor, handig tijdens het ontwikkelen.
Rechts op de zelfde regel, de temperatuur nadat deze berekend is door de software, zien jullie ook het Celsius teken
De tweede regel begint met een "O" wat staat voor de Oven controler en de uitgang is hier laag en in het display aangegeven met "Off" En zichtbaar omdat de rode LED uit is.
PH betekend "Pre-Heath" en de status is "On" omdat de gemeten temperatuur zich beneden de ingestelde 26,5C bevind.
Er zitten hier nog twee sensoren op het breadboard maar vergeet deze maar, als ik ga testen met de weerstadn zitten deze er niet meer op.
Ook is er een 4K7 weerstand zichtbaar die naar de analoge ingang-7 gaat, hiermee heb ik nog een mogelijkheid om met een condensator wat te filteren aan de ingang van de Arduino.
De uitgang die de rode LED aanstuurd gaat ook een "Low Level" fet aansturen via een netwerkje van wat weerstanden diode en een condensator.
Het komt er op neer dat de condensator van de Gate naar ground langzamer geladen gaat worden dan als de uitgangs zeg "0" wordt van de Arduino als de temperatuur bereikt is.
Met een diode en weerstand in serie maak ik het ontlaad proces van deze condensator sneller, hierdoor ontstaat er minder overshoot van de temperatuur bij het opwarmen.
Later laat ik schema hier van zien, nu te gaar om dit schema verder af te werken deze avond, omdat ik ook nu nog wat wil laten zien hoe ik de code heb gemaakt.
Ik heb mijn best gedaan wat ik tot nu toe heb geleerd toe te passen en het is aan jullie mij even de oren te wassen *grin*
Hier de al redelijk opgeschoonde code...
c code:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack of a PCF8574
float temp; // Variabelen nodig voor het middelen van een analoge temperatuur meting
float adcTemp = 0;
float uref = 1.0734;
float tempA;
word i = 0;
unsigned long tempReading;
const byte tempPin = 7;
const word smpl = 100;
const float setOven = 29.50;
const float preHeath = 26.50;
void setup() {
Wire.begin();
Serial.begin(9600);
analogReference(INTERNAL); // Maakt gebruikt van de interne referentie spanning van de gebruikte Arduino Nano (gemeten spanning 1.0734V)
pinMode(10, OUTPUT); // Maakt van pin-10 een uitgang
pinMode(11, OUTPUT); // Maakt van pin-11 een uitgang
lcd.begin (16,2); // Steld het type LCD in: 16 x 2, met de achtergrond verlichting "aan"
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH); // Zet de achtergrondverlichting van het display aan
digitalWrite(10, LOW); // Startwaarde uitgang 10, "uit" de ingestelde temperatuur is nog niet bereikt
digitalWrite(11, HIGH); // Startwaarde uitgang 11, "aan" de ingestelde temperatuur voor de "preheat" is nog niet bereikt en de uitgang is hierom hoog
}
void loop (){
for(int i = 0; i < smpl; i++) // Hier wordt de analoge ingang (7) "x" gemeten, x = de variabele "smpl"
{
tempReading += analogRead(7);
delay(1);
}
adcTemp = tempReading / smpl; // Deelt de som van de metingen door het aantal samples "smpl"
tempA = adcTemp * (uref/1024.0); // Verrekend de verwerkte samples met de referentie spanning en de bitwaarde van de ADC converter
temp = tempA / 0.02; // Berekend de Temperatuur van de TMP37 Sensor met de 20mV/C gevoeligheid van de sensor, de variabel "temp" geeft nu de temperatuur aan in Celsius.
if (temp > setOven) { // Deze vergelijking kijkt of de oventemperatuur al is bereikt, als dit zo is, dan wordt uitgang "10" low en wordt de verwarming afgeschakeld
digitalWrite(10, HIGH);
lcd.setCursor (0,1);
lcd.print("O = On ");
} else {
digitalWrite(10, LOW);
lcd.setCursor (0,1);
lcd.print("O = Off");
}
if (temp > preHeath) { // Deze vergelijking kijkt of de "preheath" temperatuur al is bereikt, als dit zo is, dan wordt uitgang "11" low en worden de verwarmings elementen in serie geschakeld
digitalWrite(11, LOW);
lcd.setCursor (8,1);
lcd.print("PH = Off ");
} else {
digitalWrite(11, HIGH);
lcd.setCursor (8,1);
lcd.print("PH = On ");
}
lcd.setCursor (8,0); // Plaatst de temperatuur van de oven op positie "8 op regel "0"
lcd.print(temp);
lcd.print((char)223); // Plaatst het "°C" achter de temperatuurwaarde
lcd.print("C");
lcd.setCursor (0,0); // Plaatst de RAW waarde van de ADC op positie "0" op regel "1", handig tijdens het ontwikkelen
lcd.print(analogRead(7));
Serial.println(adcTemp);
adcTemp = 0;
tempReading = 0;
// lcd.setCursor (0,0); // Plaatst aantal gebruikte samples van de analoge meting op LCD scherm, handig tijdens het ontwikkelen
// lcd.print(adcTemp);
delay(1);
}
Nog niet alles staat hier in de variabelen aangegeven zoals het aantal mV van de gebruikte sensor, deze staat nu nog als vaste waarde van 0.02 in de code.
Er zijn nog wat variaben die ik iets anders wil noemen voor de duidelijkheid, maar dat doe ik waarschijnlijk morgen, hangt van mijn werk af
Ik hoor graag van jullie waar ik zaken moet aanpassen of meer netjes oplossen in de code.
Bedankt en gegroet,
Blackdog