temperatuur instellen met decimalen

Dag allen,

Ik ben bezig met een aquariumcontrollertje met een arduino Mega en 3.2'' TFT. Wil hier simpel mijn temperatuur mee uitlezen/verwarming aansturen en pH uitlezen/CO2 aansturen.

Na behoorlijk wat inlezen, tutorials en proberen ben ik inmiddels al een aardig eind op weg en heb hiervoor een aantal pagina's geschreven waar ik op mijn tft e.e.a. kan uitlezen en instellen. Ik struikel op dit moment over het volgende:

om het verwarmingselement aan sturen (middels een relay aan/uit te zetten) tot mijn ingestelde temperatuur is bereikt, wil ik logischerwijs de temperatuur in kunnen stellen. Dit wil ik graag per 0.1 graad instellen. Nu is dat per 0.1 graad voor temperatuur niet zo relevant en kan ik gerust af met hele graden, maar ik heb exact dezelfde paginasetup voor pH en daarvoor is het wel van belang.

Vooralsnog kan ik de temperatuur instellen op hele graden, maar ik krijg het met decimalen niet voor elkaar. In eerste instantie probeerde ik

float count = 0.0, lastCount;
const float tempUpg = 0.1;

void loop ()
{
count < 28 ? "count+tempUpg" : count = 18;
}

maar krijg dan de foutmelding dat ik een const char met een int wil samenvoegen en dat kan niet. Ik heb al lopen zoeken naar het omzetten van floatings (floats?) naar iets anders, maar ik begrijp niet goed waarnaar ik het dan moet omzetten of hoe.

Zou iemand me op weg willen helpen? Hieronder de gehele code voor dit stuk van mijn project.

#include <memorysaver.h>
#include <UTFT.h>

#include <URTouch.h>
#include <URTouchCD.h>


UTFT    myGLCD(ILI9341_16, 38, 39, 40, 41);
URTouch  myTouch( 6, 5, 4, 3, 2);


extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t Various_Symbols_32x32[];

float count = 0.0, lastCount;

int x, y;
const float tempUpg = 0.1;
int tempUp = 0;
int tempDown = 0;

void setup() {
    myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  drawTemperatureSetting();
}

//==========Temp Config ============
void drawTemperatureSetting() 
{
  //====Back to Main button====
  myGLCD.setColor(100, 155, 203);
  myGLCD.fillRoundRect (270, 190, 310, 230);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(Various_Symbols_32x32);
  myGLCD.setBackColor(100, 155, 203);
  myGLCD.print("g", 275, 194);
  myGLCD.drawRoundRect (270, 190, 310, 230);
  //====Back to Settings button====
  myGLCD.setColor(100, 155, 203);
  myGLCD.fillRoundRect (220, 190, 260, 230);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(Various_Symbols_32x32);
  myGLCD.setBackColor(100, 155, 203);
  myGLCD.print("e", 225, 194);
  myGLCD.drawRoundRect (220, 190, 260, 230);
  //====Page Title====
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.setFont(BigFont);
  myGLCD.print("Temp config", CENTER, 10);
  //====Current temp====
  myGLCD.setFont(SmallFont);
  myGLCD.print("Huidige temp:", 10, 36);
  //==Current Set temp
  myGLCD.setFont(SmallFont);
  myGLCD.print("Huidige set temp:", 10, 56);
  //====Line====
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawLine(0, 78, 319, 78);
  //====Select temp====
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SmallFont);
  myGLCD.print("Select temp", 10, 93);
  //====New temp====
  myGLCD.setFont(BigFont);
  myGLCD.print("Nieuwe Temp:", 118, 89);
  //myGLCD.setFont(SevenSegNumFont);
  //myGLCD.printNumI(tempUpg, 160, 125);
  //====Temp Up====
  myGLCD.setColor(223, 77, 55);
  myGLCD.fillRoundRect (10, 115, 90, 148);
  myGLCD.setBackColor(223, 77, 55);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(Various_Symbols_32x32);
  myGLCD.print("c", 35, 115);
  myGLCD.drawRoundRect (10, 115, 90, 148);
  //====Temp Down====
  myGLCD.setColor(223, 77, 55);
  myGLCD.fillRoundRect (10, 156, 90, 189);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (10, 156, 90, 189);
  myGLCD.setBackColor(223, 77, 55);
  myGLCD.setColor(255, 255, 255);
  myGLCD.print("d", 35, 157);
}

// Highlights the button when pressed
void drawFrame(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
}

void loop()
{
  if (myTouch.dataAvailable())
  {
    myTouch.read();
    x = myTouch.getX();
    y = myTouch.getY();

    // ==If we press the tempUp Button 
    if ((x >= 10) && (x <= 90) && (y >= 115) && (y <= 148))
    {
      count < 28 ? count++ : count = 18;
      delay (200); // de delay zit erin omdat zonder, de waarde niet normaal is in te stellen. Zelfs bij de geringste aanraking schiet hij al omhoog/omlaag.
    }

    // ==If we press the tempDown Button
    if ((x >= 10) && (x <= 90) && (y >= 156) && (y <= 189))
    {
      count > 18 ? count-- : count = 28;
      delay (200);
    }
  }

  if (count != lastCount)
  {
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setColor(255, 255, 255);
    myGLCD.setFont(BigFont);
    myGLCD.printNumF(count, 1, 160, 125);
    lastCount = count;
  }
}

een float optellen is simpel een + gebruiken dus newtemp=oldtemp+ 0.1

Bedankt voor je reactie!

Hmz. Dat is inderdaad hoe ik begon. Ik kreeg het toen alleen niet voor elkaar om gelijk de nieuwe waarde te laten zien, die kreeg ik pas als ik in mijn menu een pagina terug ging en weer opnieuw in mijn temperatuursettingpagina ging. Vast iets met op het verkeerde moment laten zien op het TFT.

Wat ik toen nog niet had was de boven- en ondergrens van het bereik waarbinnen ik de temperatuur in kan stellen, zeg 18 tot 28 graden. Dat zou ik graag meenemen.

Ik ben alweer een goed uurtje aan het puzzelen met je suggestie, maar krijg het toch niet helemaal voor elkaar. Mogelijk probeer ik deze twee benaderingen op de verkeerde manier te combineren?

float tempNew = 0.0, lastTemp;
float tempUpg = 0.1;

// ==If we press the tempUp Button 10, 115, 90, 148
    if ((x >= 10) && (x <= 90) && (y >= 115) && (y <= 148))
    {
      
      tempNew < 28 ? tempNew = tempNew + 0.1 : lastTemp = 18;
      delay (200);
    }

    // ==If we press the tempDown Button
    if ((x >= 10) && (x <= 90) && (y >= 156) && (y <= 189))
    {
      tempNew > 18 ? tempNew = tempNew - 0.1 : lastTemp = 28;
      delay (200);
    }

    if (tempNew != lastTemp)
    {
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.setColor(255, 255, 255);
      myGLCD.setFont(BigFont);
      myGLCD.printNumF(tempNew, 1, 160, 125);
      lastTemp = tempNew;
    }

Het levert me een aantal vragen op:

  • Als ik mijn code vervang door jouw suggestie (zoals hierboven) werkt dit voor het omhoog bijstellen van de temperatuur. Dezelfde formule opzet voor het bijstellen van de temperatuur naar beneden werkt niet (doet niets)? Waarom niet?

  • de boven- en ondergrens werken echter niet. Met de code in mijn beginpost kon ik de temperatuur instellen van 18-28 graden en begon bij 28 dan weer bij 18. Waarom werkt dit nu niet?

  • als ik aan het begin tempNew definieer als "float tempNew = tempOld + tempUpg" werkt dit niet. Ik krijg dan enkel 0.1 als waarde te zien. Als ik dan tempNew++ doe kan ik wel verhogen, maar per hele eenheid, zoals volgens de documentatie ook hoort. Is het mogelijk om aan het begin van de code de tempNew dusdanig te definieren dat ik enkel bovenin de waarde waarmee ik temperatuur verhoog/verlaag aan kan passen, zonder door de hele code te moeten zoeken naar de juiste plek?

[edit: ik ben me ervan bewust dat onderstaande code inderdaad 0.1 als output geeft na 1x drukken, omdat er nergens wordt aangegeven deze waarde per vervolg indrukken van de knop te verhogen]

[edit2: tempNew = tempNew + tempUpg werkt natuurlijk wel. Laatste vraag is daarmee beantwoord. Kan echter nog steeds niet temp omlaag bijstellen en boven- en onderwaarde werken ook niet.]

In deze laatste versie blijft tempNew ongewijzigd. Is dit de versie die niet werkt?

tempNew < 28 ? tempNew : lastTemp = 18;

tempNew > 18 ? tempNew : lastTemp = 28;

Wat zou er echt moeten gebeuren? Zolang kleiner 28 + 0.1 resp. -0.1 ?

De erop volgende "if (tempNew != lastTemp)" daarna altijd WAAR.

lastTemp wordt wel op 18 of 28 gezet maar wijzigt direct weer naar de waarde van tempNew.

Waarschijnlijk werkt "tempNew < 28 ? tempNew = tempNew +0.1 : tempNew = 18; " beter.

ja, dat had ik niet moeten doen. Dat laatste stuk code was verwarrend. Heb die verwijderd.

Wat je zegt over "tempNew < 28 ? tempNew = tempNew +0.1 : tempNew = 18;" klopt. Dat werkt inderdaad, zie ook de eerste (en nu enige) code in mijn vorige post. (al denk ik dat je met "tempNew = 18" "lastTemp = 18" bedoelt?)
wat echter dus NIET werkt is de temp naar beneden bijstellen:
"tempNew > 18 ? tempNew = tempNew - 0.1 : lastTemp = 28;"

[edit] sja.....wat zal ik zeggen. Laat ik maar eens beginnen met niet zo eigenwijs te doen als ik om hulp vraag... :-[ :-X ::slight_smile: Toch even geprobeerd (baat het niet dan schaad het niet) en het werkt wonders :smiley: . Merci beaucoup!!!!

Het verveleden met computers is: ze doen wat je zegt en niet wat je bedoelt :slight_smile:

Dat is opzich natuurlijk heel handig, je moet alleen even snappen wat je precies moet zeggen :slight_smile:

ik ben vandaag verder gegaan met de eeprom tutorials, zodat ik mijn, nu werkende, temperatuursinstelling kan opslaan, uitlezen en aan mijn temperatuursensor en relay kan koppelen.

Omdat het floats betreft, begrijp ik dat ik de EEPROM.put() en EEPROM.get() moet gebruiken. Heb dan ook met de betreffende tutorials zitten spelen om o.a. te zien hoe ik die waarden naast de serial monitor op mijn tft scherm krijg. Met de opzet van de tutorial lukt dat.

Aanvullend op de vorige code van mij heb ik een extra knop gemaakt die moet saven en de EEPROM.put() functie moet uitvoeren.

In de EEPROM.put() tutorial wordt een structure 'customVar" opgezet met 3 variabelen. In de void setup() wordt deze variabelen vervolgens een vaste waarde gegeven. Vervolgens kan je in de EEPROM.get() tutorial deze waarden uitlezen met EEPROM.get(eeAddress, customVar). Om deze op mijn tft te laten zien gebruik ik myGLCD.printNumF(EEPROM.get(eeAddress, customVar."naam1vd3variabelen"), 1, x-coordinaat, y-coordinaat)

Dus ik dacht e.e.a. uit de tutorials over te nemen. Maar dat werkt niet zo straight forward. Ik kan de nieuwe temperatuur instellen, waarom werkt het niet om tempNew naar EEPROM te schrijven? Ik heb geprobeerd dit in verschillende manieren te schrijven, maar ben er nog niet in geslaagd.

float tempNew = 18;
float tempUp = 0.1;
float tempDown = 0.1;
int eeAddress = 0;
int x, y;


struct config_t
{
  float tempNew;
} configuration;

void loop()
{
  if (myTouch.dataAvailable())
  {
    myTouch.read();
    x = myTouch.getX();
    y = myTouch.getY();

    // ==If we press the tempUp Button 10, 115, 90, 148
    if ((x >= 10) && (x <= 90) && (y >= 115) && (y <= 148))
    {
      tempNew < 28 ? tempNew = tempNew + tempUp : tempNew = 18;
      drawFrame(10, 115, 90, 148);
      delay (200);
    }

    // ==If we press the tempDown Button
    if ((x >= 10) && (x <= 90) && (y >= 156) && (y <= 189))
    {
      tempNew > 18 ? tempNew = tempNew - tempDown : tempNew = 28;
      drawFrame(10, 156, 90, 189);
      delay (200);
    }
    
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setColor(255, 255, 255);
    myGLCD.setFont(BigFont);
    myGLCD.printNumF(tempNew, 1, 160, 125);

    if ((x >= 170) && (x <= 210) && (y >= 190) && (y <= 230)) //170, 190, 210, 230
    {
      
      EEPROM.put(eeAddress, configuration);
      
      drawFrame(170, 190, 210, 230);
    }
  }

  myGLCD.setFont(SmallFont);
  myGLCD.print("Huidige set temp:", 10, 56);
  myGLCD.printNumF(EEPROM.get(eeAddress, configuration.tempNew), 1, 160, 56);
  
}

lol. Wat is dit toch f*cking awesome 8)

De hele dag lopen proberen en het is gelukt. Ik snap alleen de ballen waarom het op deze manier wél werkt.

Ik probeerde eerst e.e.a. uit te schrijven bij de variabelen boven de void setup () (hoe heet dit stuk in je code?), maar daar kreeg ik het dus maar niet voor elkaar.

Als ik echter ipv tempNew te gebruiken, een nieuwe float tempSet maak, die in de struct zet en vervolgens pas in de void loop() de waarde tempNew toeken, kan ik naar EEPROM schrijven en laat mijn code netjes de huidige temperatuursetting zien en update wanneer ik weer op save druk.

Ik snap alleen gewoon niet waarom deze regel "configuration.tempSet = tempNew;" in de loop() moet en niet bovenin kan staan?

float tempNew = 18;
float tempSet;
int eeAddress = 0;

struct config_t
{
  float tempSet;
  };

struct config_t configuration;


void loop()
{
if ((x >= 170) && (x <= 210) && (y >= 190) && (y <= 230)) //170, 190, 210, 230
    {
      [b]configuration.tempSet = tempNew;[/b]
      EEPROM.put(eeAddress, configuration.tempSet);
      
      drawFrame(170, 190, 210, 230);
    }
}

Zelf nog niet met EEPROM wat gedaan. Je niet werkende code wijkt wel af van het voorbeeld van EEPROM.put. Met "struct" creëer je volgens mij een object met daarin dus een float met een naam.
In het voor beeld wordt aan die float een waarde toegekend in het SETUP deel van de sketch. Als je de variabele configuration.tempNew met de waarde wil vullen op het moment van het drukken van een knop moet dat zoals je nu hebt gedaan in de LOOP worden geprogrammeerd. Ergens anders kan er alleen een vaste waarde aan gegevens worden. De oude variabele met de zelfde naam (tempNew) gebruiken als waarde binnen de struct is voor de compiler een brug te ver.

Dat het bij jou niet werkt vanuit de setup(), betekent dat je iets fout doet. Echter laat je alleen de code van de loop() zien. Dus wordt het wat lastig om aan te geen wat verkeerd doet

ZUID:
Zelf nog niet met EEPROM wat gedaan. Je niet werkende code wijkt wel af van het voorbeeld van EEPROM.put. Met "struct" creëer je volgens mij een object met daarin dus een float met een naam.
In het voor beeld wordt aan die float een waarde toegekend in het SETUP deel van de sketch. Als je de variabele configuration.tempNew met de waarde wil vullen op het moment van het drukken van een knop moet dat zoals je nu hebt gedaan in de LOOP worden geprogrammeerd.

ja, dat is eigenlijk heel logisch.

Ergens anders kan er alleen een vaste waarde aan gegevens worden. De oude variabele met de zelfde naam (tempNew) gebruiken als waarde binnen de struct is voor de compiler een brug te ver.

Helder en eigenlijk ook logisch. Gezien tempNew op verschillende momenten een waarde toegekend krijgt, weet hij natuurlijk niet welke tempNew hij nu moet gebruiken.

nicoverduin:
Dat het bij jou niet werkt vanuit de setup(), betekent dat je iets fout doet. Echter laat je alleen de code van de loop() zien. Dus wordt het wat lastig om aan te geen wat verkeerd doet

Ik ben mssn niet helemaal duidelijk geweest. setup() staat hier volledig buiten, daar heb ik niets mee gedaan. Het ging om het stuk BOVEN de setup(), waar ik de verschillende floats en de struct beschrijf.

Voor de volledigheid de volledige code van de temperatuursettingspagina. Inmiddels werkt alles prima. Enige schoonheidsfoutje is dat ik de knoppen om bij te stellen niet anders kan kleuren (void drawFrame() ) op het moment dat ik ze indruk, dan loopt alles vast. Maar aangezien ik liever heb dat de waarden blijven veranderen zolang ik de knoppen indruk (zoals nu het geval is), kan ik leven met het feit dat je nu niet "ziet" dat je de knop indrukt. Ik ben tevreden zo :slight_smile:

Bedankt voor de hulp en uitleg!

#include <EEPROM.h>

#include <memorysaver.h>
#include <UTFT.h>

#include <URTouch.h>
#include <URTouchCD.h>


UTFT    myGLCD(ILI9341_16, 38, 39, 40, 41);
URTouch  myTouch( 6, 5, 4, 3, 2);

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t Dingbats1_XL[];
extern uint8_t various_symbols[];
extern uint8_t Various_Symbols_16x32_v2[];
extern uint8_t Various_Symbols_32x32[];

float tempNew = 18;
float tempUpg = 0.1;
float tempSet;
int eeAddress = 0;
int x, y;




struct config_t
{
  float tempSet;
};

struct config_t configuration;


//Temp Config ============================

void drawTemperatureSetting() {

  //==Back to Main button
  myGLCD.setColor(100, 155, 203);
  myGLCD.fillRoundRect (270, 190, 310, 230);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(Various_Symbols_32x32);
  myGLCD.setBackColor(100, 155, 203);
  myGLCD.print("g", 275, 194);
  myGLCD.drawRoundRect (270, 190, 310, 230);
  //Back to Settings button
  myGLCD.setColor(100, 155, 203);
  myGLCD.fillRoundRect (220, 190, 260, 230);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(Various_Symbols_32x32);
  myGLCD.setBackColor(100, 155, 203);
  myGLCD.print("e", 225, 194);
  myGLCD.drawRoundRect (220, 190, 260, 230);
  //Save temp setting
  myGLCD.setColor(100, 155, 203);
  myGLCD.fillRoundRect (170, 190, 210, 230);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(Various_Symbols_32x32);
  myGLCD.setBackColor(100, 155, 203);
  myGLCD.print("<", 175, 194);
  myGLCD.drawRoundRect (170, 190, 210, 230);
  //==Page Title
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.setFont(BigFont);
  myGLCD.print("Temp config", CENTER, 10);
  //==Current temp
  myGLCD.setFont(SmallFont);
  myGLCD.print("Huidige temp:", 10, 36);
  //==Current Set temp
  myGLCD.setFont(SmallFont);
  myGLCD.print("Huidige set temp:", 10, 56);
  //==Line
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawLine(0, 78, 319, 78);
  //==Select temp
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SmallFont);
  myGLCD.print("Select temp", 10, 93);
  //==New temp
  myGLCD.setFont(BigFont);
  myGLCD.print("Nieuwe Temp:", 118, 89);
  //myGLCD.setFont(SevenSegNumFont);
  //myGLCD.printNumI(tempUpg, 160, 125);
  //==Temp Up
  myGLCD.setColor(223, 77, 55);
  myGLCD.fillRoundRect (10, 115, 90, 148);
  myGLCD.setBackColor(223, 77, 55);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(Various_Symbols_32x32);
  myGLCD.print("c", 35, 115);
  myGLCD.drawRoundRect (10, 115, 90, 148);
  //==Temp Down
  myGLCD.setColor(223, 77, 55);
  myGLCD.fillRoundRect (10, 156, 90, 189);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (10, 156, 90, 189);
  myGLCD.setBackColor(223, 77, 55);
  myGLCD.setColor(255, 255, 255);
  myGLCD.print("d", 35, 157);
}

// Highlights the button when pressed
void drawFrame(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
}

void setup() {
  // put your setup code here, to run once:
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  drawTemperatureSetting();
}

void loop()
{
  if (myTouch.dataAvailable())
  {
    myTouch.read();
    x = myTouch.getX();
    y = myTouch.getY();

    // ==If we press the tempUp Button 10, 115, 90, 148
    if ((x >= 10) && (x <= 90) && (y >= 115) && (y <= 148))
    {
      tempNew < 28 ? tempNew = tempNew + tempUpg : tempNew = 18;
      delay (200);
    }

    // ==If we press the tempDown Button
    if ((x >= 10) && (x <= 90) && (y >= 156) && (y <= 189))
    {
      tempNew > 18 ? tempNew = tempNew - tempUpg : tempNew = 28;
      delay (200);
    }
    
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.setColor(255, 255, 255);
      myGLCD.setFont(BigFont);
      myGLCD.printNumF(tempNew, 1, 160, 125);
    

    // ==If we press the saveTemp Button
    if ((x >= 170) && (x <= 210) && (y >= 190) && (y <= 230))
    {
      configuration.tempSet = tempNew;
      EEPROM.put(0, configuration.tempSet);

      drawFrame(170, 190, 210, 230);
    }
  }

  myGLCD.setFont(SmallFont);
  myGLCD.print("Huidige set temp:", 10, 56);
  myGLCD.printNumF(EEPROM.get(0, configuration.tempSet), 1, 160, 56);
}

De setup() is nu de plek om met EEPROM.get de opgeslagen temperatuur weer terug te halen naar tempNew (nu standaard op 18 graden). Bij herstart van de Arduino blijft dan de juiste temperatuur ingesteld. Wel even controleren of er een waarde tussen 18 en 28 graden is opgeslagen. Eerste keer (met een nieuwe Arduino) zal er waarschijnlijk 0 worden opgehaald.

Ah. Ja. Ik snap wat jullie bedoelen. Dat is opzich wel handig inderdaad. Moet nu steeds van 18 (of naar beneden gelijk vanaf 28) graden/pH 5.0 omhoog tot de waarde die ik wil. Niet heel erg, maar wel zo handig als dat niet hoeft.

Heb dit als volgt verwerkt. Werkt aardig. Wanneer ik mijn temperatuursettingpagina verlaat en weer open, blijft de waarde tempNew staan op hoe ik hem de laatste keer heb achtergelaten (zonder de waarde op te slaan). Omdat ik tempNew weer een nieuwe waarde heb gegeven welke dan wordt weergegeven. Dat vind ik verwarrender dan vanaf 18 graden beginnen. Dat komt door de manier waarop ik de pagina heb opgezet en de huidige ingestelde temperatuur kleiner wordt weergegeven dan de nieuwe temperatuur.
Ik krijg het niet voor elkaar bij het opnieuw openen van de temperatuursettingpagina te beginnen vanaf de huidig opgeslagen temperatuur ipv de temperatuur zoals ik die heb achtergelaten.

//==EEPROM Locations
// 0 = Temperature setting
// 5 = pH setting

//==Structs
struct config_t
{
  float tempSet;
  float pHSet;
};

struct config_t configuration;


//==Temp
float tempC = 0;
float tempNew = 18;
float tempUpg = 0.1;
float tempSet;

void setup ()
{
  tempNew = EEPROM.get(0, configuration.tempSet);
  
}

void loop()
{
// TemperatureSetting / Temp.config Screen
    if (currentPage == '2')
  {
    myGLCD.setColor(255, 255, 255);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setFont(SmallFont);
    myGLCD.printNumF(EEPROM.get(0, configuration.tempSet), 1, 160, 56);
    myGLCD.setFont(BigFont);
    myGLCD.printNumF(tempNew, 1, 160, 135);

    if (myTouch.dataAvailable())
    {
      myTouch.read();
      x = myTouch.getX();
      y = myTouch.getY();

      // ==If we press the tempUp Button 10, 115, 90, 148
      if ((x >= 10) && (x <= 90) && (y >= 115) && (y <= 148))
      {
        tempNew < 28 ? tempNew = tempNew + tempUpg : tempNew = 18;
        delay (200);
      }

      // ==If we press the tempDown Button
      if ((x >= 10) && (x <= 90) && (y >= 156) && (y <= 189))
      {
        tempNew > 18 ? tempNew = tempNew - tempUpg : tempNew = 28;
        delay (200);
      }
    
      if (tempNew >= 20 || tempNew <= 27)
      {
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.setColor(255, 255, 255);
        myGLCD.setFont(Various_Symbols_32x32);
        myGLCD.print("T", 235, 120);
      }
      if (tempNew < 20 || tempNew > 27)
      {
        myGLCD.setColor(255, 255, 255);
        myGLCD.setFont(Various_Symbols_32x32);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.print("O", 235, 120);
      }


      // ==If we press the saveTemp Button
      if ((x >= 170) && (x <= 210) && (y >= 190) && (y <= 230))
      {
        configuration.tempSet = tempNew;
        EEPROM.put(0, configuration.tempSet);
        drawFrame(170, 190, 210, 230);
      }

      // ==If we press the Main Button (270, 190, 310, 230)
      if ((x >= 270) && (x <= 310) && (y >= 190) && (y <= 230))
      {
        drawFrame(270, 190, 310, 230);
        currentPage = '0'; // Indicates we are at home screen
        myGLCD.clrScr();
        drawHomeScreen(); // Draws the Home Screen
      }
      // ==If we press the Back Button (210, 190, 260, 230)
      if ((x >= 220) && (x <= 260) && (y >= 190) && (y <= 230))
      {
        drawFrame(220, 190, 260, 230);
        currentPage = '1'; // Indicates we are at Setting screen
        myGLCD.clrScr();
        drawSettingScreen(); // Draws the Setting Screen
      }
    }
  }

Mijn volgende stap is het schrijven van de voids voor de twee relays. Ik heb het nog niet helemaal uitgedacht, maar vooralsnog is mijn idee om voor de relays die het verwarmingselement en de CO2(magneetventiel) in en uit moet schakelen een void Verwarmingselement() en void CO2() te schrijven en daarin de EEPROM.get() te zetten en te linken aan de huidige temperatuur/pH. Deze voids () worden bij opstart, net als mijn void Homescreen() aangeroepen in de void setup(). Vervolgens zal ik deze voids () ook in de void loop () aan moeten roepen.

Klinkt dit als een logische benadering?

Even een antwoord op de EEPROM.get in de setup.
Ik had me niet gerealiseerd dat je met een knop de ingestelde waarde naar de EEPROM stuurt.
Als je het voordeel wil krijgen van "instelling komt terug op de laatst ingestelde waarde" bij een herstart van de Arduino moet je de EEPROM.put elke keer als de waarde is aangepast uitvoeren. Herstel dus ook na stroomstoring en niet thuis, anders gaat hij naar 18 graden.
Het nut van de opslag zoals nu geprogrammeerd met knop zie ik nog niet.
Voor de relais is het ook niet echt nodig de ingestelde temperatuur en andere variable zijn voor het hele programma ook zonder EEPROM beschikbaar.
EEPROM is m.i alleen nuttig om ook na stroomonderbreking alle relevante variable nog beschikbaar te hebben.

PM Gaat dit wel goed? Moet || geen && zijn ( 28 is ook groter dan 20)
Je ziet het niet want met de volgende if wordt het weer overschreven :slight_smile:
if (tempNew >= 20 || tempNew <= 27)
{
myGLCD.setBackColor(0, 0, 0);
myGLCD.setColor(255, 255, 255);
myGLCD.setFont(Various_Symbols_32x32);
myGLCD.print("T", 235, 120);
}

Als er && staat kan hier ook de EEPROM.put komen.

ZUID:
Even een antwoord op de EEPROM.get in de setup.
Ik had me niet gerealiseerd dat je met een knop de ingestelde waarde naar de EEPROM stuurt.
Als je het voordeel wil krijgen van "instelling komt terug op de laatst ingestelde waarde" bij een herstart van de Arduino moet je de EEPROM.put elke keer als de waarde is aangepast uitvoeren. Herstel dus ook na stroomstoring en niet thuis, anders gaat hij naar 18 graden.

Ik begrijp je niet helemaal.
-> Als ik nu de stroom van mijn arduino trek en weer aanzet, is mijn laatst ingestelde waarde (tempSet)(bijvoorbeeld 23.0 graden) te zien op de temperatuursettingpagina achter "Huidige set temp" (Huidige set temp: 23.0).
-> Die waarde blijft daar staan, totdat ik een nieuwe temperatuur selecteer (bijv. 24.5 graden) en op mijn 'save' knop druk, dan verschijnt de nieuw ingestelde temperatuur als tempSet (Huidige set temp: 24.5 graden).
-> Bij eerste keer openen van de temperatuursettingpagina, na opstarten van de arduino, is de laatste opgeslagen temperatuur (24.5 graden) mijn startwaarde van waaraf ik mijn nieuwe temperatuur instel (tempNew = EEPROM.get(0, configuration.tempSet).
-> Stel, ik stel dan de temperatuur (tempNew) in op 26.0 graden, maar save niet. Als ik dan vanuit mijn temperatuursettingpagina terugga naar het settingsmenu, van waaruit ik ook naar een pHsettingpagina kan, of terug ga naar het homescreen en dan opnieuw mijn temperatuursettingpagina inga, dan staat de "Huidige set temp: 24.5 graden", maar de nieuwe temperatuur staat nog op 26.0 graden.

Ik zou dan willen dat de nieuwe temperatuur ook weer op 24.5 graden staat, maar zie niet hoe ik dit moet doen. Misschien praten we volledig langs elkaar heen hoor :smiley:

Het nut van de opslag zoals nu geprogrammeerd met knop zie ik nog niet.
Voor de relais is het ook niet echt nodig de ingestelde temperatuur en andere variable zijn voor het hele programma ook zonder EEPROM beschikbaar.
EEPROM is m.i alleen nuttig om ook na stroomonderbreking alle relevante variable nog beschikbaar te hebben.

Het is inderdaad juist vanwege een eventuele stroomonderbreking dat ik de EEPROM wil gebruiken. Ik denk dat het uit veiligheidsoverwegingen voor mijn vissen essentieel is dat bij een stroomonderbreking de in de EEPROM.put() ingestelde temperatuur/pH gebruikt worden. Anders zou bij stroomonderbreking de verwarming bijvoorbeeld niet aangaan (want tempNew = 18), of de pH veel te laag omdat mijn CO2 continu aan blijft staan (ook 's nachts) -> naast dat een lage pH op zichzelf schadelijk kan zijn is er ook de kans op vergiftiging/onvoldoende zuurstof. Dan kan ik snel een nieuw vissenbestand uitzoeken :slight_smile: Heb het 1 keer gehad toen mijn tijdschakelaar niet goed werkte (of ik niet goed had ingesteld) en de enige die het overleeft hadden waren mijn labyrinthvissen (die ook lucht happen om te ademen) en slakken...

Overigens was de tempNew = 18 enkel als startwaarde in de temperatuursetuppagina. Nu ik die startwaarde oproep vanuit EEPROM.get() is tempNew = 18 overbodig geworden en kan volgens mij gewoon "float tempNew" worden. Bij een stroomonderbreking blijft de verwarming dan juist aan, omdat tempNew geen waarde heeft? Gekookte vissen? :fearful:

In de zomer werk ik vaak vanaf locatie en ben dan enkel in het weekend thuis. Eten geven kan m'n vriendin wel 1 of 2x keer doen, maar dingen als dit hou ik liever zelf in de hand. Of iemand haalt per ongeluk de stekker eruit en doet hem er daarna weer in met het idee dat het dan weer gewoon werkt.... maar...alle instellingen foetsie. Nee, dat wil ik niet riskeren.

Ik heb eerder al een testsetup gemaakt met een relay die afhankelijk van de temperatuur een led aan/uit liet gaan. Gewoon om te kijken hoe het relay zelf werkt en hoe de code ervoor in elkaar zit. Ik weet dat het voor het relay zelf niet nodig is de waarde uit EEPROM te halen. In principe kan ik tempNew gewoon gebruiken als thresholdvalue.

PM Gaat dit wel goed? Moet || geen && zijn ( 28 is ook groter dan 20)
Je ziet het niet want met de volgende if wordt het weer overschreven :slight_smile:
if (tempNew >= 20 || tempNew <= 27)
{
myGLCD.setBackColor(0, 0, 0);
myGLCD.setColor(255, 255, 255);
myGLCD.setFont(Various_Symbols_32x32);
myGLCD.print("T", 235, 120);
}

Nee, scherp! Bedankt, moet inderdaad && zijn. Heb dit ook geprobeerd met while (tempNew >= 20 || tempNew <= 27)/else, maar dat lukte niet, dus maar 2x een if. Zullen vast meer dingetjes zijn die efficienter kunnen :stuck_out_tongue:

[edit]

Als er && staat kan hier ook de EEPROM.put komen.

Had dit gemist en heb het nog even geprobeerd. Dan schrijf ik elke keer als ik de temperatuur met 0.1 verhoog/verlaag naar EEPROM.put. Mijn save-button is dan ook niet meer nodig. Inderdaad als ik dan mijn temperatuursettingpagina verlaat en weer terugkom, staat hij op de laatst gesavede waarde. Maar wat dit doet ten opzichte van mijn vorige code is dat mijn gesavede waarde steeds veranderd ipv dat bij het opnieuw bezoeken van mijn temperatuursettingpagina de startwaarde van de temp de laatst gesavede waarde is. Verkeert om dus eigenlijk, haha!

Ik mis dan echter de informatie over mijn vorige ingestelde temperatuur. Bijvoorbeeld voor nabootsen van paaiseizoen wil ik kunnen zien met hoeveel ik verhoog ten opzichte van de vorige instelling en niet gelijk de nieuwe waarde als instelling hebben. het zien van de vorige instelling maakt het experimenteren en zoeken naar de juiste temperatuur en pH om paaigedrag te triggeren wat makkelijker.

Heel verhaal zeg.
Het is uiteraard niet mijn bedoeling je een andere keuze te laten maken.
Je hebt nu in ieder geval gezien dat je er ook voor kan kiezen bij elke instellingswijziging dit in EEPROM weg te schrijven. Je zou er eventueel dan ook nog voor kunnen kiezen de vorige waarde ook in EEROM op te nemen.
Maar dan ben ik weer voor jouw aan het denken Sorry.
Nog wel een opmerking over EEPROM mocht je er voor kiezen niet via de knop weg te schrijven maar zoals ik voorstelde bij elke wijzing, moet je er wel op letten dat je alleen de EEPROM.put moet gebruiken als er daadwerkelijk wat veranderd. Een EEPROM schijnt te "slijten" en kan maar een bepaald aantal keren gewijzigd worden ( nog wel relatief veel keer hoor).

hahaha, ja. Je gaf aan de meerwaarde van EEPROM nog niet te zien, dus dacht wat achtergrond info te geven. Ik had niet in de gaten dat het zo'n verhaal werd :slight_smile:

Het was zeer zeker niet mijn bedoeling aanvallend oid over te komen. Ik waardeer je meedenken heel erg. Ik ben nog erg nieuw met het programmeren en weet ook niet wat handig is of hoe iets op een andere manier geschreven kan worden. Suggesties die je geeft geven me veel inzicht. Daarvoor sorry zeggen is dus absoluut niet op zijn plaats! :slight_smile:

Voor wat betreft het slijten van de EEPROM. Dat is enkel het schrijven toch? Lezen kan oneindig vaak?

Of concreet, als ik mijn code voor de relays als volgt opstel, dan lees ik alleen de EEPROM, tenzij ik in mijn temperatuursettingpagina een nieuwe temperatuur instel/save. De huidige temperatuur wordt constant vergeleken met de temperatuur in EEPROM en indien lager dan de temperatuur in EEPROM, schakelt mijn relay en gaat de verwarming aan. Althans, dat is mijn bedoeling :slight_smile: Als het op deze manier geen nadelige effecten voor de levensduur van EEPROM heeft, kan het op deze manier toch? Klopt deze aanname?

//==Relays
#define IN A1 //Relay heater
#define IN A2 //Relay pH

//==Structs
struct config_t
{
  float tempSet;
  float pHSet;
};

struct config_t configuration;


//==Temp
float tempC = 0;
float tempNew = 18;
float tempUpg = 0.1;
float tempSet;

//==pH
float pHNew = 6.8;
float pHUpg = 0.1;
float pHSet;
float pHValue;


void setup() {
  // put your setup code here, to run once:
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  sd.begin(); //init SD card

  sensors.begin();//init temp. sensor

  rtc.begin();// Initialize the rtc object

  //== Set time, run once, then deactivate again
  //rtc.setDOW(SATURDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(10, 36, 40);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(14, 4, 2018);   // Set the date to January 1st, 2014

  tempNew = EEPROM.get(0, configuration.tempSet);
  pHNew = EEPROM.get(5, configuration.pHSet);

  pinMode (A1, OUTPUT); //set pin A1 as output signal for relay heater
  pinMode (A2, OUTPUT); //set pin A2 as output signal for relay pH (magneetventiel)
  digitalWrite (A1, LOW); //initially set relay heater off
  digitalWrite (A2, LOW); //initially set relay pH off

  drawHomeScreen();  // Draws the Home Screen
  currentPage = '0'; //sets current page to 0/homescreen
}

void relayTemp()
{
  if (tempC < EEPROM.get(0, configuration.tempSet))
  {
    digitalWrite (A1, HIGH);
  }
  else
  {
    digitalWrite (A1, LOW);
  }
}

void relaypH()
{
  if (pHValue > EEPROM.get(5, configuration.pHSet))
  {
    digitalWrite (A2, HIGH);
  }
  else
  {
    digitalWrite (A2, LOW);
  }
}

void loop()
{
  relayTemp();
  relaypH();

  //Home Screen
  currentMillis = millis(); //get the current "time" (actually the number of milliseconds since the program 
  started)

  if (currentMillis - pupdateMillis >= updateperiod)
  {
    pupdateMillis += updateperiod;
    if (currentPage == '0')
    {
      callTime();
      callTemp();
      callpH();
    }
    if (currentPage == '2')
    {
      callTemp();
    }
    if (currentPage == '3')
    {
      callpH();
    }
  }

// TemperatureSetting / Temp.config Screen
  if (currentPage == '2')
  {
    myGLCD.setColor(255, 255, 255);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setFont(SmallFont);
    myGLCD.printNumF(EEPROM.get(0, configuration.tempSet), 1, 160, 56);
    myGLCD.setFont(BigFont);
    myGLCD.printNumF(tempNew, 1, 160, 135);

    if (myTouch.dataAvailable())
    {
      myTouch.read();
      x = myTouch.getX();
      y = myTouch.getY();

      // ==If we press the tempUp Button 10, 115, 90, 148
      if ((x >= 10) && (x <= 90) && (y >= 115) && (y <= 148))
      {
        tempNew < 28 ? tempNew = tempNew + tempUpg : tempNew = 18;
        delay (200);
      }

      // ==If we press the tempDown Button
      if ((x >= 10) && (x <= 90) && (y >= 156) && (y <= 189))
      {
        tempNew > 18 ? tempNew = tempNew - tempUpg : tempNew = 28;
        delay (200);
      }

      if (tempNew >= 20 && tempNew <= 25)
      {
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.setColor(255, 255, 255);
        myGLCD.setFont(Various_Symbols_32x32);
        myGLCD.print("T", 235, 120);
      }
      if (tempNew < 20 || tempNew > 25)
      {
        myGLCD.setColor(255, 255, 255);
        myGLCD.setFont(Various_Symbols_32x32);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.print("O", 235, 120);
      }


      // ==If we press the saveTemp Button
      if ((x >= 170) && (x <= 210) && (y >= 190) && (y <= 230))
      {
        configuration.tempSet = tempNew;
        EEPROM.put(0, configuration.tempSet);
        drawFrame(170, 190, 210, 230);
      }

      // ==If we press the Main Button (270, 190, 310, 230)
      if ((x >= 270) && (x <= 310) && (y >= 190) && (y <= 230))
      {
        drawFrame(270, 190, 310, 230);
        currentPage = '0'; // Indicates we are at home screen
        myGLCD.clrScr();
        drawHomeScreen(); // Draws the Home Screen
      }
      // ==If we press the Back Button (210, 190, 260, 230)
      if ((x >= 220) && (x <= 260) && (y >= 190) && (y <= 230))
      {
        drawFrame(220, 190, 260, 230);
        currentPage = '1'; // Indicates we are at Setting screen
        myGLCD.clrScr();
        drawSettingScreen(); // Draws the Setting Screen
      }
    }
  }

...rest van code. Code is te lang om in zijn geheel te plaatsen en volgens mij niet nodig voor het stukje over relays. Zowel, dan hoor ik het graag.

Op deze manier gaat het niet om heel veel schrijf acties. Zo kan dus geen probleem opleveren.

Mooi. Heb het nog even getest met een led en die gaat mooi aan/uit afhankelijk van mijn huidige gemeten temperatuur en gesavede temp in EEPROM. Lijkt erop dat alles mooi werkt :slight_smile: Nu alles compact afbouwen in een mooi kastje.

ZUID, nogmaals bedankt voor je hulp!!