hulp gevraagd voor arduino regelunit voor distilleer apparaat

Hi,

net even door de bouw van je destilleerder gebladerd, geweldig !! Zelf ook een tijdje mee bezig geweest, maar ben er een beetje mee gestopt (andere hobbies) en door jouw verhaal slaat toch de stookkoorts weer toe. Ook ooit eens een keteltje geklust (kleintje):

Helaas vanwege crash niet meer foto's. Ben toen ook aan de slag gegaan met monitoring van temperatuur, ik ben toen, na een paar maanden prutsen, toch uitgekomen bij de dallas one wire sensoren, voornamelijk vanwege de nauwkeurigheid. Ik monitorde toen de handel met een op een seriele poort van mijn oude laptop aangesloten setje ds1820's (de oude versie), je kon dan ook "live" de stookcurve zien, erg leuk.

Zal binnenkort als ik wat meer tijd heb eens een kleine vergelijk in text neerzetten over het gebruik van pt100's (analoog) vs. digitaal mbv. ds18b20 oid. Digitaal is wel makkelijker (en ook eenvoudiger te kalibreren overigens, maar dat is weer een ander verhaal).

Gezien de hoeveelheid werk en de aandacht voor detail bij je ketel, ga ik er zo 123 maar even vanuit dat "het beste niet goed genoeg is", en dat je dan ook daadwerkelijk accurate temperatuurmetingen wil hebben.

Ik heb zelf weinig ervaring met Arduino's, dus met menu kan ik je helaas niet helpen, maar aangezien ik hier terecht ben gekomen door mijn wens een volledig geautomatiseerd tuinbewateringssysteem en monitoring oplossing te bouwen, zit er qua temperatuurmeten dan wel ergens een overlap in (dat wordt uiteindelijk iets van een ATTiny84/NFR24L01+/DS18B20/grondvochtigheidsmeter/luchtvochtigheidsmeter maar is nog toekomstmuziek.

mooi spul.
Toen ik in je post las over tuinbewaterings systeem dacht ik direct aan Billie's Hydroponic Controller - Exhibition / Gallery - Arduino Forum
Veel plezier ermee
Jantje

Die is idd wel gaaf, ja. Maar bij mij wordt het toch iets "simpeler". vochtigheid van de grond meten, gebaseerd op uitkomst een bepaalde tijd een klep open en de druppelslang gaat aan. Zoiets. Ooit.

Goed, zoals beloofd:

Als je temperatuur gaat meten, zit je altijd met een een of meerdere onnauwkeurigheden, hoe je het ook wendt of keert.

Stel we hangen een analoge sensor (PT100 oid) aan de Arduino, die heeft een bepaalde weerstand bij een bepaalde temperatuur, en we meten met de ADC het daaruit resulterende voltage. Onzekerheden:

  • onnauwkeurigheid van de sensor zelf (of samengestelde sensor)
  • onnauwkeurigheid van Vcc en/of
  • onnauwkeurigheid van (interne) referentievoltage Arduino
  • resolutie van de ADC (zie ADC explanation link onder)

Onnauwkeurigheid van de sensor zelf -- Kunnen we weinig aan doen, behalve een kalibratie-tabel maken. Meten op verschillende punten, wat aannames maken en een correctie factor in de berekening opnemen. Kortom, ijken met bekende waarden. Kokend water etc.
Met samengestelde sensor bedoel ik toegevoegde weerstanden/voltage dividers etc. 5% of 1% weerstand afwijking etc.

Onnauwkeurigheid van Vcc -- De arduino neemt bij een AnalogRead standaard Vcc als referentievoltage. Kwaliteit van Vcc hangt af van je voeding. Zeg dat je voeding niet 5,0 maar 5.1 volt is, gaan je metingen al alle kanten op, maar niet de goeie, en als je voeding ergens varieert tussen de 4.8 en 5.1 volt gaat het ook lekker. Een mooie stabiele voeding helpt, maar zelfs met standaard voltage regulators zit je vaak rond de 1-5% afwijking.
Je kan Vcc berekenen aan de hand van de (zie onder) interne referentie, dat helpt al een heel end. Zie link 2 onder (self-calibrating arduino adc). Heb je wel een goeie multimeter nodig. En je moet het per arduino doen.

Onnauwkeurigheid van interne referentievoltage -- De meeste arduino's beschikken over een intern referentievoltege van 2,65 of 1.1 volt. Nominaal. Met een afwijking van 10 procent, volgens het datasheet. (dus 1.0-1.2 v in totaal). Gaat ook lekker dus.

Resolutie van de ADC -- kunnen we ook weinig aan doen, behalve een andere ADC eraan hangen. Voor uitgebreide uitleg zie arduino ADC explanation link onderaan.

So far analoog.

Stel we hangen er een digitale sensor aan, bijv. de (Maxim) Dallas DS18B20. Onzekerheden:

  • de sensor.
    (en meer niet, het ding levert gewoon "de temperatuur")

De sensor zelf kan je net als de analoge versie kalibreren. Dallas/Maxim heeft hier zelfs een (vrij makkelijke) app note voor geschreven. De grote vraag is: hoe kom je aan de ijkpunten. Kokend water, ijswater of kokende alcohol, verzin het maar. En dan hopen dat je dat goed geregeld hebt.

Datasheet stelt dat de sensor +/- 0.5 C correct is binnen de gestelde randvoorwaarden (temperatuur, voedingsspanning etc), die nauwkeurigheid heb je al. Verder zijn er een aantal zaken binnen de sensor die de nauwkeurigheid beinvloeden (binnen de gestelde normal operating limits).

  • Aantal metingen: blijhkbaar warmt de sensor zichzelf ietsjes op als je constant metingen aan het doen bent. Te voorkomen door niet iedere seconde, maar bijv. iedere 10 seconden een meting te doen (meting verbruikt stroom, stroom wordt omgezet in warmte, sensor warmt op. (google ds18b20 self heat)

  • Resolutie van de sensor: hoe hogere resolutie je wil, hoe meer stroom gebruikt wordt. Standaard wordt geloof ik 12 bits resolutie gebruikt, dit kan je terugzetten naar 9 bits desgewenst.

Conclusie -- zoals reeds gezegd, een persoonlijke voorkeur.

Ik ben absoluut geen software liefhebber, maar voornamelijk het gemak en de eenvoud waarmee een vrij nauwkeurige sensor (een halve graad is toch al vrij nauwkeurig) lekker makkelijk aan een arduino geprikt kan worden, en eventueel via software nog een beetje gekieteld kan worden, vind ik(persoonlijk) fijn. Fijner dan hopen dat alle afhankelijkheden van de analoge RTC/weerstand gelezen en omgerekend wordt. Geen geknutsel met stabiele voedingen, 0.1% weerstandjes, externe componenten aan je arduino of whatever.

Nu ben ik er wel eentje van kort-door-de-bocht-snel-klaar, mind you :wink: Ik weet niet precies hoe nauwkeurig je de het hele stookproces wilt monitoren. Lijkt me dat een graad of 0.2 al heel aardig is, en dat lijkt me nog wel te bereiken met een eventueel met ijs/kokend water danwel een maat met een geijkte (digitale) thermometer.

arduino ADC explanation:

"self-calibrating" the arduino ADC:
http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/

Hoi matjans.
Fijn dat je ook jouw 2 cents bijdraagt alhier, omdat je je er al een tijd mee hebt beziggehouden en dus de nodige bagage hebt.
Maar heb je wel de hele thread gelezen ?

Er staat onder andere in dat er al sensoren zijn die bij voorkeur gebruikt worden, maar waarvan het niet duidelijk is welke sensoren het precies zijn.
En de historie van het verhaal is ook dat de Engelse taal een factor is, verwijzen naar Engelse handleidingen (omdat die nou eenmaal beschikbaar zijn) lijkt mij niet direct een oplossing voor homedistiller.
Misschien spreek ik wel voor mn beurt en valt het allemaal wel mee, maar dit is de reden waarom het hier in de Nederlandstalige sectie besproken word.

Gezien de huidige status van het project leek het me geen slecht idee om homedistiller de voor en nadelen van digitaal vs analoog temp meten even te schetsen zodat hij zelf kan beslissen welke route te bewandelen. De prijs van de sensoren is niet zodanig hoog dat voorkeuren kunnen veranderen.

Tenminste, als de status inmiddels niet al achterhaald is. @homedistiller, nog updates ? :slight_smile:

Verwarmingselement aansturen kan overigens vrij eenvoudig met een PID library, zijn beschikbaar voor arduino in verschillende vormen, die op zijn beurt een SSR aanstuurt (relais) dat dan weer het verwarmingselement aan- en uit schakelt.

Afhankelijk van hoe je stookt, natuurlijk. Als je alleen geinteresseerd bent in een constante temperatuur over een bepaald tijdvak, is het niet zo heel ingewikkeld. Mocht je ook iets met flow-rate willen doen, wordt het lastiger (niet zozeer in techniek, maar meer op programmeervlak).

Sorry voor de late reactie
maar ik kreeg geen forum mail meer binnen bij nieuwe post.
Dacht eindelijk dat het een beetje doodgebloeid was.

Ik zit er inderdaad aan te denken om de pt100 niet te gebruiken.
En inderdaad voor digitaal te gaan.
Heb ik ook minder ingangen nodig.
en voor de ds18b20 staan er heel veel codes.
Helaas zal dit nog een hele tijd duren.
Vooral omdat het menu al erg veel werk is voor mij.

Het wilt namelijk niet echt vlotten hiermee.
Kom gewoon niet veder.

Daarbij dan weer meer opties toevoegen zal voor mij ben ik bang te veel zijn gegrepen.
Ik ben er nog wel over aan het lezen en proberen.
maar ik zal toch een simpelere code moeten gaan zoeken voor het menu.
Alleen als ik kijk naar de andere codes die voor menu's worden gebruikt.
Is die van Nas toch het best te begrijpen voor mij.
Ook het punt dat hij al erg veel tijd en energie in mijn project heeft gestoken.
hier dank voor.

Dus als er iemand is die me wilt helpen met het menu opbouwen.
Hoor ik dit graag!

Zal van de week even toe voegen hoever ik ben.

mvg Rolf

p.s:

ik hoef het verwarmings element alleen maar uit of aan te zetten.
Het regelen van de uitloop kraan in stappen open en dicht is de bedoeling.
Hiermee regel je de alcohol sterkte.
Deze kraan mag ook aangestuurd worden met een servo denk dat dit makkelijker is te realiseren kwa software voor mij.

Hoi Rolf.

Heb je al een overzicht gemaakt van de stappen die je wil maken ?
Wellicht kan bijvoorbeeld matjans je na het bekijken daarvan nog wel tips geven over dingen die er ook in kunnen of het overzicht verfijnen.

Dat ik tijd gestoken heb in deze thread, verplicht jou natuurlijk tot niets.
Als je een andere oplossing vind of bedenkt die voor jou beter blijken, moet je dat vooral gebruiken.
Natuurlijk stel ik het dan wel op prijs als je dat dan hier laat zien, want dat is dan weer ter leringh ende vermaack.

Ook voor dat menu maak je het best een overzicht hoe je het wil maken, met hoe het er uit zal zien en wat er allemaal in moet.
Houd er ook rekening mee dat je in de toekomst wellicht meer in je menu wil hebben en het dus kunt uitbreiden.

Die aftapkraan, draait dat licht genoeg voor een servo, en heb je aan een slag van 180 graden genoeg ?

Hoi Mas

Met de stappen ben ik bezig.
Ook door proefstoke9n te doen en te bekijken hoe ik dit kan omzetten naar automatish.
Dit ben ik op papier aan het zetten.

Die 180 graden zal voldoende zijn.
Ik ga liever met een servo werken omdat ik hier meer verstand van heb.
Een sterke servo is niet zon punt.
Een kraan maken van rvs met een slag van 180 graden ook niet.

Maar dan zou ik eerst het software gebeuren voor elkaar willen hebben.

Ik hou jullie op de hoogte.
Zal jullie ook binnen kort laten zien hoe ik het menu zou willen maken.
Denk dat ik daarvan uit ook veder moet gaan werken.

Mvg rolf

homedistiller:
Zo nu gaan we weer een stukje veder.
Ik denk dat het zo voor mij het best te overzien is.
En andere kunnen dan helpen als ik een foutje maak of tips geven.
Ik wil het menu van mas3 aanhouden omdat ik hier het meest van snap
en meest aan gewerkt heb. (hiervoor dank naar Mas)
wel helemaal opnieuw beginnen.

de tweede uitdaging die ik nu moet gaan maken.
wat moet er gaan gebeuren?
nadat de welkoms tekst is geweest.
Staat er op het lcd scherm press
Ik wil nu door op de ok toets te druken in het menu komen.
Met twee mogelijk heden.

1 Distilleren
2 Instellingen

hieronder dan weer de sub menu's
Dit word mijn tweede uitdaging.
wat moet ik daarvoor gaan doen?
-code toevoegen voor de 5 toetsen
-met het menu beginnen met twee keuzes.

hou jullie op de hoogte.

Ik ben er in geslaagd om het volgende stukje menu er in te verwerken.
Als ik na het intro verhaaltje op de toets oke druk.
Gaat hij netjes naar het volgende menu.

-MAAK U KEUZE-
DISTILLEREN
INSTELLINGEN
Press

Ik ben bezig geweest om het pijltje er voor te krijgen en die de keuze aan te laten "wijzen"
Dit met stukken uit mijn andere menu's.
De pijl komt wel in beeld maar ik kan hem niet verplaatsen met mijn toetsen.
Ik zal de code die ik heb tot het tweede menu hier even neerzetten zonder het pijltje en de code hiervoor.
Hier wil ik morgen weer mee aan de gang gaan.
zouden jullie voor mij de code tot nu toe even kunnen controleren op foutjes en of voorzien van extra
leerzame comentaar?

gr Rolf

/*
het menu word bediend met 5 toetsen
up/down/left/right/select
Deze komen op analooge pin 0

Het begint met opstarten met een stukje tekst.
onder in beeld verschijnd druk OK.
dan gaat hij naar MM=2 
Het lcd word leeggemaakt
Het menu word weergegeven maar zonder pijl en je kunt nog geen keuze maken.
dit gaan we doen in deel 3

 */

#include <LiquidCrystal.h>                                                   // Geeft aan dat er een lcd scherm gebruikt wordt.
LiquidCrystal lcd(12, 11, 8, 5, 4, 3, 2);                                 // Dit gedeelte stelt mijn lcd in. 

int adc_key_val[5] ={50, 200, 400, 600, 800 };               // Ingangs waarden van mijn toetsen.
int mm = 1;                                                  // Sets menu mode to 1.
int NUM_KEYS = 5;                                            // geeft volgens mij aan het aantal knoppen dat er gebruikt word voor input.
int adc_key_in;
int key=-1;                                                  // Presets the pressed key; -1 means no key pressed yet.
int KeyDet=-1;                                               // Keep track of key press detection.
int oldkey=-1;                                               // Same here for the last pressed key.
int i=0;                                                     // i word gebruikt als teller later, moet bij 0 beginnen inplaats van 1
int Arrow=126;                                               // code voor de "pijl" symbool
int Item = 1;                                                // beschikbare menu items
int x=0;                                                     // x coordinaat voor setCursor.
int y=0;                                                     // y coordinaat voor setCursor.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SETUP
void setup()
{                                                            // 1 // Begin setup deze doorloopt hij alleen bij opstarten of reset
Serial.begin(9600);                                          // opent de seriele poort en zet data verkeer op 9600 bps.
 
  lcd.begin(20, 4);                                          // geeft aan dat het om een 20x4 lcd gaat.
  lcd.clear();                                               // maakt het lcd scherm leeg.
  
  lcd.setCursor(0,0);                                        // zet de cursor neer op rij 1 op positie 1.
  lcd.print("       WELKOM");                                // zet tekst neer "WELKOM"
  delay (2000);                                              // wacht 2 sec. 
                                                         
  lcd.setCursor(0,1);                                        // Zet de cursor neer op rij 2 op positie 1.
  lcd.print("  VEEL PLEZIER MET");                           // Zet tekst neer "VEEL PLEZIER MET".
  delay (1000);                                              // wacht 1 sec.
  
  lcd.setCursor(0,2);                                        // Zet de cursor neer op rij 3 op positie 1.
  lcd.print("    DISTILLEREN!");                             // Zet tekst neer "DISTILLEREN!".
  delay (2000);                                              // Wacht 2 sec.
  
  lcd.clear();                                               // Maakt het lcd scherm weer leeg.
  lcd.setCursor(0,1);                                        // Zet de cursor op rij 2 positie 1.
  lcd.print("  AUTOMATIC STILL!");                            // Zet tekst neer ÄUTOMATIC STILL!".
  
  delay (2000);                                              // Wacht 2 sec.
  lcd.setCursor(0,3);                                        // Zet de cursor op rij 4 op positie 1.
  lcd.print("V.2.0     Press <OK>");
  }                                                          // 1 // << Sluit de setup af.
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LOOP
  void loop()                                                // Hier begint het programma te lopen.
  {                                                          // 1
  key = (analogRead (0));                                    // lees analoge ingang op pin 0
  if (key != oldkey)                                         // Waneer een druktoets word gebruikt  "!=" betekend niet gelijk
  delay(50);                                                 // Wacht voor 0,05 sec
  adc_key_in = analogRead(0);                                // Lees de waarde op de analoge ingang 0
  key = get_key(adc_key_in);                                 // Zet deze waarde in een toets om
  if (key != oldkey)    
  {                                                          // 2  
  KeyDet = 1;                                                // We've detected a new pressed key and registered that event
  oldkey = key;
  if ((key ==4))                                             // Waneer toets 4 "OK" gedetecteerd word ga dan naar menu 2
  {                                                          // 3    
  mm = 2;                                                    // zie hierboven: ga naar menu 2
  lcd.clear();                                               // maak het lcd scherm leeg oftewel wis het vorige menu
                                                       
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  MENU 2
  if (mm ==2)                                              
  {                                                          // 4
    lcd.clear();                                             // Clear the LCD screen to prepare it for the menu that will follow
    lcd.setCursor(0,0);
    lcd.print("   -MAAK U KEUZE-");
    lcd.setCursor(1,1); 
    lcd.print("DISTILLEREN");
    lcd.setCursor(1,2); 
    lcd.print("INSTELLINGEN");
    lcd.setCursor(0,3);
    lcd.print("           Press<OK>");
    mm = 3;                                                 // Remember the screen has been cleared and the menu is already displayed
 
  }}}}                                                      // sluit 1/2/3/4
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Zet spanning om in toets nummer
 int get_key(unsigned int input)
{                                                            // 1
  int k;
  for (k = 0; k < NUM_KEYS; k++)                             // Start counting
{                                                            // 2
  if (input < adc_key_val[k])                                // should be more reliable as it looks for a range instead of a fixed value.
{                                                            // 3
  return k;                                                  // Breaks the for loop
}                                                            // sluit 3                                                            
}                                                            // sluit 2
  if (k >= NUM_KEYS)k = -1;                                  // No valid key pressed
  return k;                                                  // So break the loop and look for another keypress
}                                                            // sluit 1
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Zo het eerste menu is opgebouwd.
Ik kan nu in dit menu voor twee keuzes kiezen.
Namelijk DISTILLEREN en INSTELLINGEN.
Je kunt de keuze maken om het pijltje voor de keuzes te verplaatsen met de toets omhoog of omlaag.
Na het maken van de keuze moet je op de toets oke duwen.
Nu heb ik voor keuze INSTELLINGEN een vervolg gemaakt
Voor DISTILLEREN nog niet
Als je voor INSTELLINGEN kiest
Word in de code het lcd leeggemaakt de cursor op de eerste regel gezet op positie 1
en INSTELLINGEN weergegeven.

Hier komt het probleem wat ik nu krijg en eindelijk niet weet hoe dit op te lossen.
Als ik nu op de toets oke druk nr 4
Gaat hij weer terug naar het vorige menu.
Ik denk dat dit komt doordat hij nog steeds controleerd of toets 4 (oke) word bediend wat ik heb toegepast
In het begin van de code voor na de intro tekst op oke te drukken om in het eerste menu te komen.

heeft hier iemand een idee hoe dit te voorkomen?
Of komt het ergens anders door?

De Code

#include <LiquidCrystal.h>                                   // Geeft aan dat er een lcd scherm gebruikt wordt.
LiquidCrystal lcd(12, 11, 8, 5, 4, 3, 2);                    // Dit gedeelte stelt mijn lcd in. 

int adc_key_val[5] ={50, 200, 400, 600, 800 };               // Ingangs waarden van mijn toetsen.
int mm = 1;                                                  // Sets menu mode to 1.
int NUM_KEYS = 5;                                            // geeft volgens mij aan het aantal knoppen dat er gebruikt word voor input.
int adc_key_in;
int key=-1;                                                  // Presets the pressed key; -1 means no key pressed yet.
int KeyDet=-1;                                               // Keep track of key press detection.
int oldkey=-1;                                               // Same here for the last pressed key.
int i=0;                                                     // i word gebruikt als teller later, moet bij 0 beginnen inplaats van 1
int Arrow=126;                                               // code voor de "pijl" symbool
int Item = 1;                                                // beschikbare menu items
int x=0;                                                     // x coordinaat voor setCursor.
int y=0;                                                     // y coordinaat voor setCursor.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SETUP
void setup()
{                                                            // 1 // Begin setup deze doorloopt hij alleen bij opstarten of reset
Serial.begin(9600);                                          // opent de seriele poort en zet data verkeer op 9600 bps.
 
  lcd.begin(20, 4);                                          // geeft aan dat het om een 20x4 lcd gaat.
  lcd.clear();                                               // maakt het lcd scherm leeg.
  
  lcd.setCursor(0,0);                                        // zet de cursor neer op rij 1 op positie 1.
  lcd.print("       WELKOM");                                // zet tekst neer "WELKOM"
  delay (2000);                                              // wacht 2 sec. 
                                                         
  lcd.setCursor(0,1);                                        // Zet de cursor neer op rij 2 op positie 1.
  lcd.print("  VEEL PLEZIER MET");                           // Zet tekst neer "VEEL PLEZIER MET".
  delay (1000);                                              // wacht 1 sec.
  
  lcd.setCursor(0,2);                                        // Zet de cursor neer op rij 3 op positie 1.
  lcd.print("    DISTILLEREN!");                             // Zet tekst neer "DISTILLEREN!".
  delay (2000);                                              // Wacht 2 sec.
  
  lcd.clear();                                               // Maakt het lcd scherm weer leeg.
  lcd.setCursor(0,1);                                        // Zet de cursor op rij 2 positie 1.
  lcd.print("  AUTOMATIC STILL!");                            // Zet tekst neer ÄUTOMATIC STILL!".
  
  delay (2000);                                              // Wacht 2 sec.
  lcd.setCursor(0,3);                                        // Zet de cursor op rij 4 op positie 1.
  lcd.print("V.2.0     Press <OK>");
  }                                                          // 1 // << Sluit de setup af.
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LOOP
  void loop()                                                // Hier begint het programma te lopen.
  {                                                          // 1
  key = (analogRead (0));                                    // lees analoge ingang op pin 0
  if (key != oldkey)                                         // Waneer een druktoets word gebruikt  "!=" betekend niet gelijk
  delay(50);                                                 // Wacht voor 0,05 sec
  adc_key_in = analogRead(0);                                // Lees de waarde op de analoge ingang 0
  key = get_key(adc_key_in);                                 // Zet deze waarde in een toets om
  if (key != oldkey)    
  {                                                          // 2  
  KeyDet = 1;                                                // We've detected a new pressed key and registered that event
  oldkey = key;
  if ((key ==4))                                             // Waneer toets 4 "OK" gedetecteerd word ga dan naar menu 2
  {                                                          // 3    
  mm = 2;                                                    // zie hierboven: ga naar menu 2
  lcd.clear();                                               // maak het lcd scherm leeg oftewel wis het vorige menu
                                                                     
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  MENU 2
  if (mm ==2)                                              
  {                                                          // 4
    lcd.clear();                                             // Maakt het scherm leeg voor het nieuwe menu
    lcd.setCursor(0,0);                                      // Zet de cursor op de eerste regel op de eerste positie
    lcd.print("   -MAAK U KEUZE-");                          // Zet de tekst neer: "-MAAK U KEUZE-"
    lcd.setCursor(1,1);                                      // Zet de cursor op de tweede regel op de tweede positie.
    lcd.print("DISTILLEREN");                                // Zet de tekst neer: "DISTILLEREN"
    lcd.setCursor(1,2);                                      // Zet de cursor op de derde regel op de tweede positie.
    lcd.print("INSTELLINGEN");                               // Zet de tekst neer: "INSTELLINGEN"
    lcd.setCursor(0,3);                                      // Zet de cursor op de vierde regel op de eerste positie
    lcd.print("           Press<OK>");                       // Zet de tekst neer: "Press<OK>"
  }
else KeyDet = 0;                                         // The key is the same as last key, so no new pressed key
    mm = 3;                                                  // Remember the screen has been cleared and the menu is already displayed
  }
  if (mm ==3){ 
  switch (Item){;                                            // 
case 1:{ 
  lcd.setCursor(x,y);                                        // Because we registered a keypress to an other Item, we reset the cursor to the last position
  lcd.print(" ");                                            // And erase it by printing a space over it
  y=1;                                                       // After erasing the arrow, we can now set the pointer to the new position
  x=0;                                                       // Remember counting starts at zero
  break;
}                                                            // Sluit case 1
case 2:{
  lcd.setCursor(x,y);
  lcd.print(" ");
  y=2;
  x=0;
  break;
}                                                             // Sluit case 2
}                                                             // Sluit switch  
lcd.setCursor(x,y);                                           // Zet de cursor op de goede plek.
lcd.write(Arrow);                                             // en laat de pijl zien
  
  if (mm ==3) {                                               // 5
    lcd.setCursor(1,0);

if (KeyDet){                                                  // We already analyzed and put a value in key
                                                              // Because we need to release the key before we go to some next item, we need to see whether the key value is new or not
if ((key)==2) Item++;                                         // Key UP
if ((key)==1) Item--;                                         // Key DOWN
if ((Item)==3) Item=1;     //  5-1                            // dit stukje is hoe de pijl over het menu gaat en weer terug    // Roll over to the first item
if ((Item)==0) Item=2;     //  0-4                            // Ga naar de laatste item
if ((Item==2)&&(key==4)) {                                    // Waneer "INSTELLINGEN" is gekozen en op de toets (4) OK word geduwd
Item = 1;                                                     // Reset Item, because else we'll enter at the exit item and might be forced out before we're in the menu
mm = 4;                                                       // Reset Menu mode so next run we're out of the menu
lcd.clear();                                                  // Clear the display to make it ready for normal mode
lcd.setCursor(0,0);                                           // I'm not sure we really need to reset the cursor
lcd.print("   -INSTELLINGEN-");
}                                                                                          
  }}}}}                                                       // sluit 1/2/3/4/5

                             
 
   
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Zet spanning om in toets nummer
 int get_key(unsigned int input)
{                                                             // 1
  int k;
  for (k = 0; k < NUM_KEYS; k++)                              // Start counting
{                                                             // 2
  if (input < adc_key_val[k])                                 // should be more reliable as it looks for a range instead of a fixed value.
{                                                             // 3
  return k;                                                   // Breaks the for loop
}                                                             // sluit 3                                                            
}                                                             // sluit 2
  if (k >= NUM_KEYS)k = -1;                                   // No valid key pressed
  return k;                                                   // So break the loop and look for another keypress
}                                                             // sluit 1
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Hoi Rolf.

Op wat je nu hebt geplaatst, is niet veel aan te merken.
(Alleen dat het " - MAAK UW KEUZE -" is).
Deze word ook zonder klachten gecompileerd.

Wat je in de gaten moet houden is de waarde MM (Menu Mode).
In dit stukje verlaat je op het eind MM2.
In MM2 heb je het menuscherm gebouwd en staan de betreffende teksten op hun plaats.
De volgende stap is dan MM3, waarin je de cursor op de plaats zet, en afhankelijk van de plaats waar de cursor staat iets gaat doen met de andere toetsen (links / rechts, select(OK)).
Hiervoor hoef je dus het menu niet telkens opnieuw te schrijven als je de pijl verplaatst.
Je hebt inmiddels MM2 verlaten en hebt omgeschakeld naar MM3.
In MM3 werd er in mijn eerder getoonde menu gekeken naar de waarde Item.
Die waarde werd tijdens MM3 gekoppeld aan de toetsen omhoog en omlaag, binnen de mogelijke waarden gehouden en daarna werd de oude plaats van het pijltje gewist, en het pijltje op de nieuwe plaats gezet.
In MM3 kan ook op een andere toets worden gedrukt, en de waarde van Item bepaalt dan wat er gedaan word, maar bij jouw MM3 heb je die mogelijkheid niet, en komt dat pas later in een volgend menu.
Die andere toetsen kunnen zijn dat er naar een volgend menu word omgeschakeld (OK toets), een waarde word verhoogd (pijltje links /rechts) of het menu word verlaten of 1 stap terug word gedaan (ook met de OK toets).
Je kunt natuurlijk nog meer dingen verzinnen die je dan zou willen doen.

Na MM3 kom je in jouw geval het distilleren scherm, of in jet instellingen scherm.
Dat zijn dan dus weer eigen menu modes.
Je gaat dan bijvoorbeeld naar MM4 voor je distilleer scherm en als je daar iets kunt selecteren en/of instellen dan zou je daarvoor MM4 kunnen gebruiken.
Je moet dus voor het opbouwen van een scherm een menu modus, en voor het verwerken van dat scherm een volgende menu modus gebruiken.
Dat doe je bij elk scherm dat je bouwt, al heb je er 25.
Dus je moet heel goed bijhouden waar je bent gebleven.

Ben benieuwd naar je volgende werk.

Je had inmiddels alweer twee keer een volgend stukje geplaatst.
Mijn vorige bericht sloeg dus op 3 van jouw berichten terug.

Probeer het commentaar zo goed mogelijk op dezelfde plaats te laten beginnen, dan is het een stuk overzichtelijker dan nu met de commentaren die steeds verspringen.

Als je denkt dat er nog steeds op de OK knop gedrukt word, betekent dat dat de waarde van de gedrukte knop niet vernieuwd is voor je dat controleert.
Daarom kun je in dat geval voor de controle die waarde aanpassen.
Je kunt hier dan -1 van maken, dat geeft aan geen knop gedrukt.
Maar in de sketch die ik eerder heb geplaatst word gecontroleerd of de huidige waarde van Key, afwijkt van de vorige waarde.
Als die wel afwijkt, dan word er pas wat gedaan met die toetsdruk.
En als die niet afwijkt, zou er dus ook niets moeten gebeuren.

  void loop()                                                // Hier begint het programma te lopen.
  {                                                                // 1
  key = (analogRead (0));                            // lees analoge ingang op pin 0
  if (key != oldkey)                                      // Waneer een druktoets word gebruikt  "!=" betekent niet gelijk
  delay(50);                                                 // Wacht voor 0,05 sec
  adc_key_in = analogRead(0);                  // Lees de waarde op de analoge ingang 0
  key = get_key(adc_key_in);                    // Zet deze waarde in een toets om
  if (key != oldkey)    
  {                                                                // 2  
  KeyDet = 1;                                               // We've detected a new pressed key and registered that event
  oldkey = key;
  if ((key ==4))                                            // Waneer toets 4 "OK" gedetecteerd word ga dan naar menu 2
  {                                                                // 3    
  mm = 2;                                                    // zie hierboven: ga naar menu 2
  lcd.clear();                                                // maak het lcd scherm leeg oftewel wis het vorige menu
                                                                     
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  MENU 2
  if (mm ==2)                                              
  {                                                               // 4
    lcd.clear();                                             // Maakt het scherm leeg voor het nieuwe menu
    lcd.setCursor(0,0);                                // Zet de cursor op de eerste regel op de eerste positie
    lcd.print("   -MAAK U KEUZE-");           // Zet de tekst neer: "-MAAK U KEUZE-"
    lcd.setCursor(1,1);                                  // Zet de cursor op de tweede regel op de tweede positie.
    lcd.print("DISTILLEREN");                     // Zet de tekst neer: "DISTILLEREN"
    lcd.setCursor(1,2);                                 // Zet de cursor op de derde regel op de tweede positie.
    lcd.print("INSTELLINGEN");                  // Zet de tekst neer: "INSTELLINGEN"
    lcd.setCursor(0,3);                                // Zet de cursor op de vierde regel op de eerste positie
    lcd.print("           Press<OK>");              // Zet de tekst neer: "Press<OK>"
  }

Wanneer je naar MM2 gaat, wis je het scherm 2 keer, dat is onnodig.
Ik zie een aantal { staan met als commentaar een getal.
Die getallen zijn om de stukken code tussen {} bij te houden.
Ik zie geen } staan die bij de { horen, behalve helemaal onderaan waar alles in een keer afgesloten word.
Ik denk niet dat dat klopt.
Zet verder voor de zekerheid de { eens op dezelfde regel als de if.. , om er zeker van te zijn dat die aan elkaar gekoppeld zijn.
Dus dan krijg je dit in je code:

  if (mm ==2)  {                                         // 4
    lcd.clear();                                             // Maakt het scherm leeg voor het nieuwe menu
    lcd.setCursor(0,0);                                // Zet de cursor op de eerste regel op de eerste positie
    lcd.print("   -MAAK U KEUZE-");           // Zet de tekst neer: "-MAAK U KEUZE-"
    lcd.setCursor(1,1);                                  // Zet de cursor op de tweede regel op de tweede positie.
    lcd.print("DISTILLEREN");                     // Zet de tekst neer: "DISTILLEREN"
    lcd.setCursor(1,2);                                 // Zet de cursor op de derde regel op de tweede positie.
    lcd.print("INSTELLINGEN");                  // Zet de tekst neer: "INSTELLINGEN"
    lcd.setCursor(0,3);                                // Zet de cursor op de vierde regel op de eerste positie
    lcd.print("           Press<OK>");              // Zet de tekst neer: "Press<OK>"
  }

Nu is het weer veel te laat geworden en ga ik het bed induiken.
Wie weet morgen verder...

Hoi mas

De comentaren staan bij mij allemaal strak in een lijn.
Alleen als ik het hier neer kopier niet meer.

Ik begin het nu een beetje te snappen.
Alleen de { } snap ik niet helemaal
Telkens als ik een stukje code schrijf en dit wil controleren wat het doet en werkt.
Krijg ik foutmeldingen van expecting { this before enz
Waardoor ik de code dan niet kan uploaden naar mijn arduino
Wat ik dan doe is dan steeds er een bij zetten tot de fout code verdwijnt en ik de code kan uploden.
Kan hier op internet ook geen uitleg over vinden.
Zo er graag een boek over leze.
Maar deze kan ik nergens gratis vinden en downloaden.
Zou er wel een willen kopen maar omdat ik niet weet of ik het juiste boek
Heb voor mij durf ik dit niet.

Zou nog even over mijn eerste vraag terug willen komen.
Als de code begin in het stukje setup wat hij eenmaal doet.
Dan zet hij eerst een stukje tekst neer ter intro en steld hij alles in
Nu heb ik hier in de code verwerkt dat de begin tekst blijft staan totdat je de keuze ok intoets.
Dit werkt allemaal goed.
Als je oke kiest gaat hij naar mm2 menu 2 even genoemd
Daar kun je een keuze maken uit twee
Distilleren en instellingen.
Druk je in dit menu op pijltje rechts links dan gebeurd er niks.
Omdat ik dat niet heb gemaakt.
Pijl omhoog omlaag voor de keuze te maken met de pijl
En selekteren met ok.
Kies je nu voor instellingen kom je in een nieuw scherm instellingen genoemd.
Dit heb ik weergegeven met een stukje tekst instellingen
Dit heb ik gedaan om weer een nieuw menu te gaan opbouwen.
En te kijken of de code tot hier werkt.
Dit werkt ook.
Alleen als je in het nieuwe menu bent heb ik daar nog geen functies of iets aan gekoppeld.
Alleen scherm leegmaken zet de cursor op de goede plek en print de tekst instellingen.
Bedien ik nu de toetsen omhoog omlaag rechts links gebeurt er niks zoals het hoort.
Maar duw ik op toets ok
Gaat hij terug naar mm2 menu 2.
En dit is eindelijk niet de bedoeling.
Weet iemand waar de fout zit wat dit veroorzaakt?
Mvg Rolf

Ik zie het met die commentaren, bij mijn geplakte stukje van vannacht is het ook een zooitje geworden nadat ik ze allemaal netjes opgelijnd had.

Ja, van de oorzaak van je probleem heb ik wel een idee.
Met de { en } maak je een apart stukje code dat afgebakend is van andere code.
Als je dus een if.. regel maakt, en je wil dat bepaalde code alleen word uitgevoerd als de voorwaarde van die if..klopt, én dat stukje dat je wil uitvoeren meer dan 1 regel is, dan kun je dat tussen de { } zetten.
Alles wat na de { komt die bij die if.. regel begint en tot de eerstvolgende } word alleen uitgevoerd als die if.. klopt.

if (ditiswaar==1) {
deze regel word nu uitgevoerd zolang ditiswaar 1 is;
en deze regel word dan ook uitgevoerd;
}

if (ditisnietwaar==1) alleen wat er achter de if.. regel staat word nu uitgevoerd als ditisnietwaar 1 is;
deze regel na ditisnietwaar word altijd uitgevoerd omdat die dus niet afhankelijk is van de inhoud van ditisnietwaar;

Ik hoop dat je nu duidelijk word wat die { en } doen, namelijk meerdere regels code inpakken binnen een voorwaarde die je gesteld hebt, wat anders niet zou kunnen.
Als je de { en } beter toepast, zul je denk ik wel zien dat je niet ongewenst meer in een menu terecht komt.

Hoi Mas

het is allemaal wat duidelijker geworden.
Maar ik krijg het niet voor elkaar om de fout weg te krijgen.
Zou je me kunnen vertellen waar de fout zit?
Dan kan ik weer veder en kan ik kijken waarom het fout ging.
Nu zie ik het niet.
mvg Rolf

Hoi Rolf.

De fout is de regel die je hebt toegevoegd om van de foutmeldingen af te komen.
Dat is wat ik symptoom bestrijding noem.
Daarmee zorg je dat er niet meer geklaagd word, maar het probleem los je niet op.
Verder doet die regel niet wat het commentaar erbij suggereert, en dat zet jou vroeg of laat ook op het verkeerde been:

  }}}}}                                                       // sluit 1/2/3/4/5

Dat is niet waar, wat eerder waar is, is:

  }}}}}                                                       // sluit 4/3/2/1/loop

De eerste } sluit dus de laatste { af en dat is dus wat je erg goed in de gaten moet houden.
De IDE helpt je daarbij want als je een } intypt, dan laat de IDE zien bij welke { die } hoort door en een heel klein blauw randje omheen te zetten.

Doordat deze accolades niet kloppen, klopt de hele sketch niet meer en word het erg lastig om het te repareren.

Zo zie ik ergens staan:

  else KeyDet = 0;                                         // The key is the same as last key, so no new pressed key
    mm = 3;                                                  // Remember the screen has been cleared and the menu is already displayed

Daar staat dus: als er aan geen van de voorgaande voorwaarden voldaan word, dan is KeyDet nul (met als commentaar geen nieuwe toets gedrukt).
Vervolgens word zonder enige voorwaarde de menu mode op 3 gezet.
Ik kan me niet voorstellen dat dat de bedoeling was.

Het is heel veel werk om deze fouten te repareren, omdat er een aantal dingen met elkaar vergeleken meten worden.
Dat gaat mij vanavond niet lukken maar ik wil er als ik wat tijd heb best een gooi naar doen.
Ondertussen heb ik een tipje voor je.
Als je een stukje gaat schrijven wat tussen de accolades komt, zet dan tijdens het typen na de {, gelijk een } op de volgende regel, en voorzie beide regels van een passend commentaar, zoals een getal of net dat wat voor jou duidelijk is.
Daarna kun je meer regels tussen de {} toevoegen tot je hebt wat je wilde doen.

Ik ben bezig jouw sketch nog eens te bekijken.
Dat gaat nog wel ff duren want zoals gezegd is er veel te repareren.
Het probleem lijkt te beginnen op regel 76, waar zomaar ineens de menu mode naar 3 gezet word, dit stukje:

else KeyDet = 0;                                         // The key is the same as last key, so no new pressed key
    mm = 3;                                                  // Remember the screen has been cleared and the menu is already displayed

Oorspronkelijk zat daar de afhandeling van mm == 2 in, en werd na die afhandeling overgeschakeld naar de volgende menu mode (3 dus).
Dat heb ik uitgevonden door mijn voorbeeld te vergelijken met wat je nu hebt.
Ik heb ook alle commentaren vertaald naar Nederlands zodat dat wat gemakkelijker leest voor jou.
Maar ik ga 'm pas hier neerzetten als ik denk dat ie het wel weer zal doen.

En daar gaan nog wel een paar nachtjes slapen overheen (en de eerste slaap ga ik nu doen).

Hoi Mas helemaal geweldig!

Krijg het wel een beetje voor elkaar maar niet naar mijn zin.
Ik ben wel alvast begonnen met de andere onderdelen te regelen.
ssr relay geregeld.
5x ds18b20 waterdicht met snoer
en nog veel meer
ook ben ik een stappen plan aan het maken wat ik wil gaan doen.
het menu is een en dan de rest er nog bij inzetten.
Ik zie aan de tijden dat je reageerd ook een echte nachtwaker bent?
Ik lig meestal tussem 2:00 en 2:30 op bed.
Jij nog iets later als ik dit zo zie

mvg Rolf