Arduino's lopen vast

Ben bezig met een weerstation en plantenkas besturing in 1. nu heb ik een UNO in de kas voor metingen en besturing. deze zend de waardes via rs485 naar een mega wat mijn display binnen is. nu loopt de mega met ongeveer 4 uur vast en de uno ook maar volgens mij nog sneller. bij de mega met display vermoed ik dat het met de rtc te maken heeft maar kom er niet uit. bij de UNO dacht ik door de combinatie van serial comunicatie naar de mega maar ook veel debug serial prints. maar deze uitschakelen heeft totaal geen invloed.
wie kan mij helpen? het word allemaal nog veel verder uitgeboud maar met deze vastlopers er in kan ik wel doorgaan maar word het alleen maar moeilijker de problemen op te sporen natuurlijk.

Dit is de mega met display:

#include <ThreeWire.h>  
#include <RtcDS1302.h>

#include <TFT_HX8357.h>


TFT_HX8357 tft = TFT_HX8357();       // Invoke custom library

int buttonVal = 0;
float buttonCount = 0;
float previoushumkas = 10;
float previoustempkas = 10;

float previoushumbuiten = 0.1;
float previoustempbuiten = 0.1;

float humbuiten = 00.0;
float tempbuiten = 00.0;
float humkas = 00.0;
float tempkas = 00.0;
float bodem;
const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars];  // temporary array for use when parsing

float tempC = 00.0;

boolean newData = false;

//============
//Receiver code
byte greenLED = 12;
char cString[20];
byte chPos = 0;
byte ch = 0;
char dataStr[6];

ThreeWire myWire(8,9,3); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);

void setup()
{
  pinMode(2,OUTPUT);
  pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);  
 pinMode(7, OUTPUT);
 pinMode(A0,INPUT_PULLUP);


  Serial.begin(9600);  //setup software serial
 Serial1.begin(9600);

  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);

    tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);
  delay(100);

digitalWrite(2, LOW);
  pinMode(greenLED, OUTPUT);
  Serial.println("This demo expects 3 pieces of data - text, an integer and a floating point value");
  Serial.println("Enter data in this style <HelloWorld, 12, 24.7>  ");
  Serial.println();


printUI();

    Serial.begin(9600);

    Serial.print("compiled: ");
    Serial.print(__DATE__);
    Serial.println(__TIME__);


Rtc.Begin();

    RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
    printDateTime(compiled);
    Serial.println();

    if (!Rtc.IsDateTimeValid()) 
    {
        // Common Causes:
        //    1) first time you ran and the device wasn't running yet
        //    2) the battery on the device is low or even missing

        Serial.println("RTC lost confidence in the DateTime!");
        Rtc.SetDateTime(compiled);
    }

    if (Rtc.GetIsWriteProtected())
    {
        Serial.println("RTC was write protected, enabling writing now");
        Rtc.SetIsWriteProtected(false);
    }

    if (!Rtc.GetIsRunning())
    {
        Serial.println("RTC was not actively running, starting now");
        Rtc.SetIsRunning(true);
    }

    RtcDateTime now = Rtc.GetDateTime();
    if (now < compiled) 
    {
        Serial.println("RTC is older than compile time!  (Updating DateTime)");
        Rtc.SetDateTime(compiled);
    }
    else if (now > compiled) 
    {
        Serial.println("RTC is newer than compile time. (this is expected)");
    }
    else if (now == compiled) 
    {
        Serial.println("RTC is the same as compile time! (not expected but all is fine)");
    }
}

//============
void loop()
{ 
  //digitalWrite(4, HIGH);
  //delay(5000);
  //digitalWrite(5, HIGH);
  //delay(5000);
  //digitalWrite(6, HIGH);
  //delay(5000);
  //digitalWrite(7, HIGH);
  //delay(500);
  //digitalWrite(7,LOW);
  //digitalWrite(4, LOW);
  //delay(5000);
  //digitalWrite(5, LOW);
  //delay(5000);
  //digitalWrite(6, LOW);
  //
  digitalWrite(2, LOW);
  recvWithStartEndMarkers();
  if (newData == true)
  {
    strcpy(tempChars, receivedChars);
    // this temporary copy is necessary to protect the original data
    //   because strtok() used in parseData() replaces the commas with \0
    parseData();
    showParsedData();
    newData = false;
  }
  printKasTemperature();
   printKasHumidity();

   printRemoteTemperature();
   printRemoteHumidity();
   time();
   //Button();
}


//============
void Button()
{
//buttonVal = digitalRead(A0);
//if ((buttonVal = HIGH) && (buttonCount <3));
//{buttonCount +1;
//digitalWrite(4,LOW);
//}
//if ((buttonVal = HIGH) && (buttonCount == 3));
// {buttonCount = 0;
// digitalWrite(4,HIGH);
// }
Serial.println (buttonCount);
// Serial.println(buttonVal);
 buttonVal = digitalRead(A0);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonVal == HIGH && buttonCount <=3) {
    // turn LED on:
    digitalWrite(4, HIGH);
    buttonCount = buttonCount +1;
  } else{
    // turn LED off:
    digitalWrite(4, LOW);
  }
  if (buttonVal == HIGH && buttonCount ==3) {
    // turn LED on:
    digitalWrite(4, HIGH);
    buttonCount = 0;
  } else{
    // turn LED off:
    digitalWrite(4, LOW);
  }
//  Serial.println(buttonState);
}

void recvWithStartEndMarkers()
{
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '<';
  char endMarker = '>';
  char rc;

  while  (Serial1.available() > 0 && newData == false)
  {
    rc = Serial1.read();
    delay(20);

    if (recvInProgress == true)
    {
      if (rc != endMarker)
      {
        receivedChars[ndx] = rc;
        ndx++;
        if (ndx >= numChars)
        {
          ndx = numChars - 1;
        }
      }
      else
      {
        receivedChars[ndx] = '\0';  // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }

    else if (rc == startMarker)
    {
      recvInProgress = true;
    }
  }
}

//============

void parseData()
{
  Serial.print(F("Received: "));
  Serial.println(tempChars);


  // split the data into its parts



  char* strtokIndx;  // this is used by strtok() as an index

  //    strtokIndx = strtok(tempChars,",");      // get the first part - the string
  //   strcpy(humbuiten, strtokIndx); // copy it to messageFromPC
  strtokIndx = strtok(tempChars, ",");  // this continues where the previous call left off
  humbuiten = atof(strtokIndx);             // convert this part to an integer


  strtokIndx = strtok(NULL, ",");  // this continues where the previous call left off
  tempbuiten = atof(strtokIndx);        // convert this part to an integer

  strtokIndx = strtok(NULL, ",");
  humkas = atof(strtokIndx);  // convert this part to a float

  strtokIndx = strtok(NULL, ",");
  tempkas = atof(strtokIndx);  // convert this part to a floa
  
  strtokIndx = strtok(NULL, ",");
  bodem = atof(strtokIndx);  // convert this part to a floa
}

//============

void showParsedData()
{
  Serial.print("humbuiten ");
  Serial.println(humbuiten);
  Serial.print("tempbuiten ");
  Serial.println(tempbuiten);
  Serial.print("humkas ");
  Serial.println(humkas);
  
  Serial.print("bodem vocht ");
  Serial.println(bodem);
}

void printUI()
{
  
tft.drawRoundRect(5,5,470,71,5,TFT_WHITE); //datum en tijd
tft.drawRoundRect(6,6,470,71,5,TFT_WHITE);

tft.drawRoundRect(5,90,220,225,5,TFT_WHITE); //remote
tft.drawRoundRect(6,91,220,225,5,TFT_WHITE);

tft.drawRoundRect(250,90,220,225,5,TFT_WHITE); //indoor
tft.drawRoundRect(251,91,220,225,5,TFT_WHITE);
  
tft.fillRect(26,90,180,40,TFT_GREEN);  //remote
tft.fillRect(270,90,180,40,TFT_CYAN);  //indoor

tft.setCursor(62,100);
tft.setTextColor(TFT_BLACK);
tft.setTextSize(3);
tft.print("Buiten");

tft.setCursor(312,100);
tft.setTextColor(TFT_BLACK);
tft.setTextSize(3);
tft.print("Kas");

tft.setCursor(162,165);
tft.setTextColor(TFT_GREEN);
tft.setTextSize(6);
tft.print("%");

tft.setCursor(412,165);
tft.setTextColor(TFT_CYAN);
tft.setTextSize(6);
tft.print("%");

tft.setCursor(162,230);
tft.setTextColor(TFT_GREEN);
tft.setTextSize(6);
tft.print("C");

tft.setCursor(145,230);
tft.setTextColor(TFT_GREEN);
tft.setTextSize(2);
tft.print("o");

tft.setCursor(412,230);
tft.setTextColor(TFT_CYAN);
tft.setTextSize(6);
tft.print("C");

tft.setCursor(395,230);
tft.setTextColor(TFT_CYAN);
tft.setTextSize(2);
tft.print("o");

}

void time () 
{
    RtcDateTime now = Rtc.GetDateTime();

    printDateTime(now);
    //Serial.println();

    if (!now.IsValid())
    {
        // Common Causes:
        //    1) the battery on the device is low or even missing and the power line was disconnected
        Serial.println("RTC lost confidence in the DateTime!");
    }

    //delay(5000); // five seconds
}

#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt)
{
    char datestring[20];

    snprintf_P(datestring, 
            countof(datestring),
            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
            dt.Month(),
            dt.Day(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
 //   Serial.print(datestring);
//}

//void printTime()
//{
  
  String dateAndTime = datestring;
  //String dateAndTime = datestring+" "+hours;
  
  tft.setTextSize(2);
  char charBuf[25];
  dateAndTime.toCharArray(charBuf, 25);
  
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.drawCentreString(charBuf,240,25,2);
//void loop();
}


//void readSensor()
//{
//  previousIndoorTemperature = indoorTemperature;
//  previousIndoorHumidity = indoorHumidity;
//  
//  indoorHumidity = dht.readHumidity();
 // indoorTemperature = dht.readTemperature();
 // Serial.println(indoorTemperature);
//  Serial.println(indoorHumidity);
//}

void printKasTemperature()
{
  String temperature;
  if(tempkas != previoustempkas)
  {
    if(humkas == 0.0 && tempkas == 0.0) //We just booted up
    {
      temperature = "---";
    }else
    {
          temperature = String(tempkas,1);
    }

    tft.fillRect(270,232,120,40,TFT_BLACK);
  
    tft.setCursor(270,234);
    tft.setTextColor(TFT_CYAN);
    tft.setTextSize(5);
    tft.print(temperature);

    previoustempkas = tempkas;
  }
}

void printRemoteHumidity()
{
  String humidity;
  if(humbuiten != previoushumbuiten)
  {
    if(humbuiten == 0.0 && tempbuiten == 0.0) //We just booted up
    {
      humidity = "---";
    }else
    {
          humidity = String(humbuiten,1);
    }
    
    tft.fillRect(20,167,120,40,TFT_BLACK);
  
    tft.setCursor(20,167);
    tft.setTextColor(TFT_GREEN);
    tft.setTextSize(5);
    tft.print(humidity);

    previoushumbuiten = humbuiten;
  }
}

void printRemoteTemperature()
{
  String temperature;
  if(tempbuiten != previoustempbuiten)
  {
    if(humbuiten == 0.0 && tempbuiten == 0.0) //We just booted up
    {
      temperature = "---";
    }else
    {
          temperature = String(tempbuiten,1);
    }
    
    tft.fillRect(20,232,120,40,TFT_BLACK);
  
    tft.setCursor(20,234);
    tft.setTextColor(TFT_GREEN);
    tft.setTextSize(5);
    tft.print(temperature);

    previoustempbuiten = tempbuiten;
  }
}

void printKasHumidity()
{
   if(humkas != previoushumkas)
  {

    String humidity = String(humkas,1);

    tft.fillRect(270,167,120,40,TFT_BLACK);
  
    tft.setCursor(270,167);
    tft.setTextColor(TFT_CYAN);
    tft.setTextSize(5);
    tft.print(humidity);

    previoushumkas = humkas; 
  }
}

en dit de zender en kas besturing een UNO:

#include <DHT.h>
//Constants
const int raamopen_pin = 7;
const int raamdicht_pin = 8;
const int ventilator_pin = 9;



#define DHTbuitenPIN 2                       // what pin we're connected to
#define DHTbuitenTYPE DHT22                  // DHT 22  (AM2302)
DHT dhtbuiten(DHTbuitenPIN, DHTbuitenTYPE);  //// Initialize DHT sensor for normal 16mhz Arduino
#define DHTkasPIN 13                          // what pin we're connected to
#define DHTkasTYPE DHT22                     // DHT 22  (AM2302)
DHT dhtkas(DHTkasPIN, DHTkasTYPE);           //// Initialize DHT sensor for normal 16mhz Arduino
int LDRInput = A0;                           //Set Analog Input A0 for LDR.
int thresholdUp = 400;
int thresholdDown = 250;
int soilPin = A1;
int soilPower = 3;//Variable for Soil moisture Power

unsigned long motorMillis = millis();
unsigned long raamMillis = millis();
unsigned long dnMillis = millis();
unsigned long tempMillis;
unsigned long bodemMillis = millis();
unsigned long serialMillis;
// funties
void temperaturen();
void display(String currState);
void dagnacht();
void raamstate(String currState);
void serial();  //com
//void motor();
void bodemvocht();

//Variables
int motorloop;
float ms;
int chk;
float humbuiten;   //Stores humidity value
float tempbuiten;  //Stores temperature value
float humkas;      //Stores humidity value
float tempkas;     //Stores temperature value
float dn;
float rs = 0;
float tempC = 0;  //com
float bodem;

char text[20];    //com
char charVal[6];  //com


void setup()
{
  pinMode(LDRInput, INPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
  digitalWrite (7, HIGH);
  digitalWrite (8, HIGH);
  digitalWrite (9, HIGH);
  digitalWrite (10, HIGH);
  digitalWrite (11, HIGH);
  digitalWrite (12, HIGH);
  pinMode(soilPower, OUTPUT);//Set D7 as an OUTPUT
  digitalWrite(soilPower, LOW);//Set to LOW so no power is flowing through the sensor

  Serial.begin(9600);
  dhtbuiten.begin();
  dhtkas.begin();
}

void loop()
{
  temperaturen();
  dagnacht();
  raamstate();
  serial();
  bodemvocht();
}

void temperaturen()

{
  static unsigned long tempMillis = millis();
  if (millis() - tempMillis > 5000)
  {  //Read data and store it to variables hum and temp
    humbuiten = dhtbuiten.readHumidity();
    tempbuiten = dhtbuiten.readTemperature();
    humkas = dhtkas.readHumidity();
    tempkas = dhtkas.readTemperature();
    tempMillis = millis();
  }
}

void dagnacht()
{
  //static unsigned long dnMillis = millis();

  if (millis() - dnMillis > 10000)
  {
    int value = analogRead(LDRInput);  //Reads the Value of LDR(light).
//    Serial.println("LDR value is :");  //Prints the value of LDR to Serial Monitor.
//    Serial.println(value);
    if (value < 400)
    {
      dn = 1;
//      Serial.println(dn);  //The LED turns ON in Dark.
//      Serial.println("nacht");
    }
    else
    {
      dn = 2;
//      Serial.println(dn);
//      Serial.println("dag");  //The LED turns OFF in Light.
    }
    dnMillis = millis();
  }
}

void raamstate()
{
  static unsigned long raamMillis = millis();
  static uint16_t raamdelay;
  enum class raamstate:uint8_t
  {
    open,        //default 0
    dicht,       // default 1
    ventilatie,  // default 2
    reset,  // default 3 }
  };
  
  static raamstate currState = raamstate::open;
 
  switch (currState)
  {

    case raamstate::dicht:
 //     Serial.println ("raam dicht");
      if ((millis() - raamMillis > 5000) && (tempkas > 27) && (dn == 2) && (rs != 1))
      {
        rs = 1;
   //     Serial.println("Raam gaat open");
        digitalWrite(9, LOW);
        digitalWrite(10, LOW);
 //       motorloop = 1;
 //       Serial.println("ventilator aan");
        digitalWrite(11, LOW);
        delay(120000);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
        //Serial.println("Raam open");
        currState = raamstate::open;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 5000) && (humkas > 50) && (dn == 2) && (rs != 1))
      {
        rs = 1;
 //       Serial.println("raam gaat naar ventilatie");
        digitalWrite(9, LOW);
        digitalWrite(10, LOW);
        //motorloop = 2;
 //       Serial.println("ventilator aan");
        digitalWrite(11, LOW);
        delay(50000);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
      //  Serial.println("Raam op ventilatie");
        currState = raamstate::ventilatie;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 5000) && (humkas > 50) && (tempbuiten > 25) && (dn == 1 && rs != 1))
      {
        rs = 1;
 //       Serial.println("raam gaat naar ventilatie");
        digitalWrite(9, LOW);
        digitalWrite(10, LOW);
//        motorloop = 2;
        delay(50000);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
        //Serial.println("Raam op ventilatie");
        currState = raamstate::ventilatie;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 5000) && (tempkas > 30) && (tempbuiten > 20) && (dn == 1 && rs != 1))
      {
        rs = 1;
//        Serial.println("raam gaat open");
        digitalWrite(9, LOW);
        digitalWrite(10, LOW);
//      motorloop = 1;
        delay(120000);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
        //Serial.println("Raam open");
        currState = raamstate::open;
        raamMillis = millis();
      }

      break;

    case raamstate::open:
//      Serial.println ("raam open");
      if ((millis() - raamMillis > 5000) && (tempkas < 23) && (rs != 2))
      {
        rs = 2;
//        Serial.println("raam gaat dicht");
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
 //       motorloop = 3;
//        Serial.println("ventilator uit");
        digitalWrite(11, HIGH);
        delay(130000);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
       // Serial.println("Raam dicht");
        raamMillis = millis();
        currState = raamstate::dicht;
      }
      else
      {
        if ((millis() - raamMillis > 5000) && (dn == 1) && (rs != 2) && (tempbuiten < 20))
        {
          rs = 2;
//          Serial.println("raam gaat dicht ivm nacht");
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
 //        motorloop = 3;
//         Serial.println("ventilator uit");
         digitalWrite(11, HIGH);
         delay(130000);
         digitalWrite(7, HIGH);
         digitalWrite(8, HIGH);
        //  Serial.println("Raam dicht");
          raamMillis = millis();
          currState = raamstate::dicht;
        }
      }
      break;

    case raamstate::ventilatie:
      //Serial.println("ventilatie");
      if ((millis() - raamMillis > 15000) && (humkas < 50) && (tempkas < 25) && (rs != 3))
      {
        rs = 3;
//        Serial.println("raam van ventilatie naar dicht");
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
 //     motorloop = 3;
//        Serial.println("ventilator uit");
        digitalWrite (11, HIGH);
        delay(51000);
        digitalWrite (7, HIGH);
        digitalWrite (8, HIGH);
        //Serial.println("Raam dicht");
        currState = raamstate::dicht;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 5000) && (humkas > 50) && (tempkas > 23) && (dn == 2) && (rs != 3))
      {
//        Serial.println("raam van ventilatie naar open");
        digitalWrite(9, LOW);
        digitalWrite(10, LOW);
 //      motorloop = 1;
//        Serial.println("ventilator aan");
        digitalWrite(11, LOW);
        delay(97000);
        digitalWrite (9, HIGH);
        digitalWrite (10, HIGH);
      //Serial.println("Raam open");
        currState = raamstate::open;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 15000) && (dn == 1) && (rs != 3) && (tempbuiten < 20))
      {
        rs = 3;
//        Serial.println("raam gaat dicht ivm nacht");
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
 //       motorloop = 3;
        Serial.println("ventilator uit");
        digitalWrite(11, HIGH);
        delay(51000);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
       //Serial.println("Raam dicht");
        raamMillis = millis();
        currState = raamstate::dicht;
      }
      break;
  
  case raamstate::reset:
//      Serial.println ("raam reset");
      if ((millis() - raamMillis > 5000) && (rs != 2))
      {
        rs = 2;
//        Serial.println("raam gaat dicht");
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
//        Serial.println("ventilator uit");
        digitalWrite(11, HIGH);
        delay(130000);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        raamMillis = millis();
        currState = raamstate::dicht;
      }
      break;
  } 
}
void serial()
{static unsigned long serialMillis = millis();
  if (millis() - serialMillis > 15000)
  {
    
  digitalWrite (13, HIGH);
  delay(2000);
  
    Serial.print("<");
    Serial.print(humbuiten);
    Serial.print(",");
    Serial.print(tempbuiten);
    Serial.print(",");
    Serial.print(humkas);
    Serial.print(",");
    Serial.print(tempkas);
    Serial.print(",");
    Serial.print(bodem);
    Serial.print(">");
 
    serialMillis = millis();
  delay(2000);
      digitalWrite (13, LOW);    
  }
  
}

void bodemvocht()
{
  String DisplayWords;
static unsigned long bodemMillis = millis();
  
  if (millis() - bodemMillis > 25000)
  {
  int sensorValue;
    digitalWrite(soilPower, HIGH);//turn D7 "On"
    delay(10);//wait 10 milliseconds 
    sensorValue = analogRead(soilPin);//Read the SIG value form sensor 
    digitalWrite(soilPower, LOW);//turn D7 "Off"
  //Serial.write("Water Level: ");
  //Serial.print(sensorValue); //Using .print instead of .write for values
  bodem = sensorValue;
  bodemMillis = millis();

  if (sensorValue <= thresholdDown){
    DisplayWords = "Dry, Water it!";
 //   Serial.print(DisplayWords);
    bodemMillis = millis();
  } else if (sensorValue >= thresholdUp){
    DisplayWords = "Wet, Leave it!";
 //   Serial.print(DisplayWords);
    bodemMillis = millis();

  } else {
  //  Serial.print(DisplayWords);
    bodemMillis = millis();
  }
  }
  //delay(500); //wait for half a second, so it is easier to read
}

Hoe weet je dat de Mega vast loopt?

Er zijn twee dingen die je misschien verder kunnen helpen

  1. Ik heb snel even naar je zender gekeken en misschien stuur je meer data naar de Mega dan in de buffer past. Als je numChars verandert naar bv 50 heb je meer plek.
  2. Voeg een blink-without-delay functie toe (je lijkt te weten hoe je met millis() moet werken dus dat zou makkelijk moeten zijn) en roep die functie aan vanuit loop(). Op die manier weet je of the Mega inderdaad vast loopt (blink stopt) of dat er iets anders fout zit.

Niet gerelateerd aan je probleem maar ik adviseer om geen magische nummers te gebruiken. Pinnen hebben een functie (bv relais, knop) dus geef ze die namen en gebruik die namen in je programma. Je doet dit niet in het Mega programma, wel in het Uno programma.

En je Mega programma is best wel grappig :wink: In printDataTime creeer je een c-string met de datum en de tijd, zet die om naar een String object en zet die vervolgens weer om naar een andere c-string om op het scherm te zetten :smiley: Ik vermoed dat ik wel weet waar dat vandaan komt (dingen uit proberen) maar het is verstandig om dat even op te schonen; het maakt het ook gemakkelijker voor anderen om je programma te begrijpen.

En als je aan het opruimen bent kun je ook de niet-gebruikte variabelen verwijderen. Dat maakt het ook gemakkelijker om je te helpen; ik zoek (om je te helpen) bv naar [ om arrays te vinden in je programma en te kijken of die groot genoeg zijn; niet gebruikte variabelen maken dat wat meer werk.

Opmerking:
Het is me niet helemaal duidelijk of je zender programma ook vast loopt?

Ja mega loopt zeker vast. En weet dat omdat de afgebeelde tijd bevriest net als de andere waardes op het scherm. Vandaar dat ik ook kan zeggen dat dat na ongeveer 4 uur is.
De zender loopt ook vast maar dat verschild van tijd soms heel snel andere x houd hij het uren vol.
Verstuurd dan geen waardes meer. En als ik dan raam functies test werken die ook niet meer.

zet al je waardes vooraan want nu doe je dat in je loop en heb je kans dat je geheugen volloopt. als je de led (13) laat knipperen weet je snel wat er gebeurt, en of het de master of de slave is.

na de nodige veranderingen. vooral na het advies van Sterretje heb ik geen vastlopers meer op de ontvanger. deze heb ik ook al weer wat uit gebreid zodat ik dus met een druk op de knop het display over schakel naar de waardes van bodem vocht en raam status. raam status krijgt nog geen waardes dat is volgende stap. alleen heb ik bij de bodem waarde wel dat hij flink flikkert. ben er nog niet achter hoe dat komt nu.
de zender/ besturing in de kas loopt ook niet meer vast nu maar doorloopt niet goed zijn programma. de seriele waardes blijft hij keurig doorsturen nu maar de besturing van de raam doorloopt hij niet. zelfs bij 35 graden in de kas stuurt hij mijn raam nu niet open.
dit zijn de huidige programma's.

ontvanger mega:

#include <ThreeWire.h>  
#include <RtcDS1302.h>
#include <TFT_HX8357.h>


TFT_HX8357 tft = TFT_HX8357();       // Invoke custom library

ThreeWire myWire(8,9,3); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);

int buttonVal = 0;
const int comPin = 2;
const int ledGroen = 6;
const int ledBlauw = 5;
const int ledRood = 4;
const int pieperPin = 7;
const int buttonPin = A0;

float buttonCount = 1;
float previoushumkas = 10;
float previoustempkas = 10;
float previousbodem = 10;
float previoushumbuiten = 0.1;
float previoustempbuiten = 0.1;
float uihumkas = 1;
float uitempkas = 1;
float uibodem = 1;
float uihumbuiten = 1;
float uitempbuiten = 1;

float humbuiten = 00.0;
float tempbuiten = 00.0;
float humkas = 00.0;
float tempkas = 00.0;
float bodem = 00;
String DisplayWords;
const byte numChars = 52; //was 32!
char receivedChars[numChars];
char tempChars[numChars];  // temporary array for use when parsing

float tempC = 00.0;
float uiState = 0;
void parseData();
void showParsedData();
void printKasTemperature();
void printKasHumidity();
void printRemoteTemperature();
void printRemoteHumidity();
void printBodem();
void time();
void Button();
void buttonoutput();

boolean newData = false;

//============
//Receiver code
//byte greenLED = 12;
char cString[20];
byte chPos = 0;
byte ch = 0;
char dataStr[6];


void setup()
{
 pinMode(comPin,OUTPUT); //com activate
 pinMode(ledGroen, OUTPUT);
 pinMode(ledRood, OUTPUT);
 pinMode(ledBlauw, OUTPUT);  
 pinMode(pieperPin, OUTPUT);
 pinMode(buttonPin,INPUT_PULLUP);




  Serial.begin(9600);  //setup software serial
 Serial1.begin(9600);

    tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);
  delay(100);

digitalWrite(comPin, LOW);
//  pinMode(greenLED, OUTPUT);
  Serial.println("This demo expects 3 pieces of data - text, an integer and a floating point value");
  Serial.println("Enter data in this style <HelloWorld, 12, 24.7>  ");
  Serial.println();


printUI();

    Serial.begin(9600);

    Serial.print("compiled: ");
    Serial.print(__DATE__);
    Serial.println(__TIME__);


Rtc.Begin();

    RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
    printDateTime(compiled);
    Serial.println();

    if (!Rtc.IsDateTimeValid()) 
    {
        // Common Causes:
        //    1) first time you ran and the device wasn't running yet
        //    2) the battery on the device is low or even missing

        Serial.println("RTC lost confidence in the DateTime!");
        Rtc.SetDateTime(compiled);
    }

    if (Rtc.GetIsWriteProtected())
    {
        Serial.println("RTC was write protected, enabling writing now");
        Rtc.SetIsWriteProtected(false);
    }

    if (!Rtc.GetIsRunning())
    {
        Serial.println("RTC was not actively running, starting now");
        Rtc.SetIsRunning(true);
    }

    RtcDateTime now = Rtc.GetDateTime();
    if (now < compiled) 
    {
        Serial.println("RTC is older than compile time!  (Updating DateTime)");
        Rtc.SetDateTime(compiled);
    }
    else if (now > compiled) 
    {
        Serial.println("RTC is newer than compile time. (this is expected)");
    }
    else if (now == compiled) 
    {
        Serial.println("RTC is the same as compile time! (not expected but all is fine)");
    }
}


//============
void loop()
{ 
  digitalWrite(comPin, LOW);
  recvWithStartEndMarkers();
  if (newData == true)
  {
    strcpy(tempChars, receivedChars);
    // this temporary copy is necessary to protect the original data
    //   because strtok() used in parseData() replaces the commas with \0
    parseData();
    showParsedData();
    newData = false;
  }

 else  if (buttonCount == 1)
  {  // tft.fillScreen(TFT_BLACK);
    printUI();
    printKasTemperature();
    printKasHumidity();
    printRemoteTemperature();
    printRemoteHumidity();
    time();
  }
else if (buttonCount == 2)
  { printUI2();
    printBodem();
    time();
  }  
  
   Button();
   buttonoutput();

}


//============
void Button()
{
//Serial.println (buttonCount);
 buttonVal = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonVal == HIGH && buttonCount <= 4) {
    //delay(10);
    buttonCount = buttonCount +1;
  }
   //else
   if (buttonVal == HIGH && buttonCount == 4) {
    //delay(10);
    buttonCount = 1;
  } 
}

void buttonoutput()
{if (buttonCount == 1) 
{
    // turn LED on:
    digitalWrite(ledRood, HIGH);
    digitalWrite(ledGroen, LOW);
    digitalWrite(ledBlauw, LOW);
  } 
  if (buttonCount == 2) 
  {
    digitalWrite(ledRood, LOW);
    digitalWrite(ledGroen, HIGH);
    digitalWrite(ledBlauw, LOW);
  } 
   if (buttonCount == 3) 
   {
    digitalWrite(ledRood, LOW);
    digitalWrite(ledGroen, LOW);
    digitalWrite(ledBlauw, HIGH);
  } 
  }

void recvWithStartEndMarkers()
{
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '<';
  char endMarker = '>';
  char rc;

  while  (Serial1.available() > 0 && newData == false)
  {
    rc = Serial1.read();
    delay(20);

    if (recvInProgress == true)
    {
      if (rc != endMarker)
      {
        receivedChars[ndx] = rc;
        ndx++;
        if (ndx >= numChars)
        {
          ndx = numChars - 1;
        }
      }
      else
      {
        receivedChars[ndx] = '\0';  // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }

    else if (rc == startMarker)
    {
      recvInProgress = true;
    }
  }
}

//============

void parseData()
{
  Serial.print(F("Received: "));
  Serial.println(tempChars);


  // split the data into its parts



  char* strtokIndx;  // this is used by strtok() as an index

  //    strtokIndx = strtok(tempChars,",");      // get the first part - the string
  //   strcpy(humbuiten, strtokIndx); // copy it to messageFromPC
  strtokIndx = strtok(tempChars, ",");  // this continues where the previous call left off
  humbuiten = atof(strtokIndx);             // convert this part to an integer


  strtokIndx = strtok(NULL, ",");  // this continues where the previous call left off
  tempbuiten = atof(strtokIndx);        // convert this part to an integer

  strtokIndx = strtok(NULL, ",");
  humkas = atof(strtokIndx);  // convert this part to a float

  strtokIndx = strtok(NULL, ",");
  tempkas = atof(strtokIndx);  // convert this part to a floa
  
  strtokIndx = strtok(NULL, ",");
  bodem = atof(strtokIndx);  // convert this part to a floa
}

//============

void showParsedData()
{
  Serial.print("humbuiten ");
  Serial.println(humbuiten);
  Serial.print("tempbuiten ");
  Serial.println(tempbuiten);
  Serial.print("humkas ");
  Serial.println(humkas);
  Serial.print("tempkas ");
  Serial.println(tempkas);
  Serial.print("bodem vocht ");
  Serial.println(bodem);
}

void printUI()
{
  if ((uiState != 1) &&(buttonCount == 1)){
      tft.fillScreen(TFT_BLACK);
      newData == true;
      uitempkas = 2;
      uihumkas = 2;
      uitempbuiten = 2;
      uihumbuiten = 2;
      uiState = 1;
    //  }

  
tft.drawRoundRect(5,5,470,71,5,TFT_WHITE); //datum en tijd
tft.drawRoundRect(6,6,470,71,5,TFT_WHITE);

tft.drawRoundRect(5,90,220,225,5,TFT_WHITE); //remote
tft.drawRoundRect(6,91,220,225,5,TFT_WHITE);

tft.drawRoundRect(250,90,220,225,5,TFT_WHITE); //indoor
tft.drawRoundRect(251,91,220,225,5,TFT_WHITE);
  
tft.fillRect(26,90,180,40,TFT_GREEN);  //remote
tft.fillRect(270,90,180,40,TFT_CYAN);  //indoor

tft.setCursor(62,100);
tft.setTextColor(TFT_BLACK);
tft.setTextSize(3);
tft.print("Buiten");

tft.setCursor(312,100);
tft.setTextColor(TFT_BLACK);
tft.setTextSize(3);
tft.print("Kas");

tft.setCursor(162,165);
tft.setTextColor(TFT_GREEN);
tft.setTextSize(6);
tft.print("%");

tft.setCursor(412,165);
tft.setTextColor(TFT_CYAN);
tft.setTextSize(6);
tft.print("%");

tft.setCursor(162,230);
tft.setTextColor(TFT_GREEN);
tft.setTextSize(6);
tft.print("C");

tft.setCursor(145,230);
tft.setTextColor(TFT_GREEN);
tft.setTextSize(2);
tft.print("o");

tft.setCursor(412,230);
tft.setTextColor(TFT_CYAN);
tft.setTextSize(6);
tft.print("C");

tft.setCursor(395,230);
tft.setTextColor(TFT_CYAN);
tft.setTextSize(2);
tft.print("o");
  }
}

void printUI2()
{
 if ((uiState != 2) && (buttonCount == 2))
 {
      tft.fillScreen(TFT_BLACK);
      newData == true;
      uiState = 2;
      uibodem = 2;
      //}

  tft.drawRoundRect(5,5,470,71,5,TFT_WHITE); //datum en tijd
tft.drawRoundRect(6,6,470,71,5,TFT_WHITE);

tft.drawRoundRect(5,90,220,225,5,TFT_WHITE); //remote
tft.drawRoundRect(6,91,220,225,5,TFT_WHITE);

tft.drawRoundRect(250,90,220,225,5,TFT_WHITE); //indoor
tft.drawRoundRect(251,91,220,225,5,TFT_WHITE);
  
tft.fillRect(26,90,180,40,TFT_YELLOW);  //remote
tft.fillRect(270,90,180,40,TFT_RED);  //indoor

tft.setCursor(62,100);
tft.setTextColor(TFT_BLACK);
tft.setTextSize(3);
tft.print("Bodem");

tft.setCursor(312,100);
tft.setTextColor(TFT_BLACK);
tft.setTextSize(3);
tft.print("Raam");

//tft.setCursor(162,165);
//tft.setTextColor(TFT_YELLOW);
//tft.setTextSize(6);
//tft.print("%");

//tft.setCursor(412,165);
//tft.setTextColor(TFT_RED);
//tft.setTextSize(6);
//tft.print("%");
 }
}


void time () 
{
    RtcDateTime now = Rtc.GetDateTime();

    printDateTime(now);
    //Serial.println();

    if (!now.IsValid())
    {
        // Common Causes:
        //    1) the battery on the device is low or even missing and the power line was disconnected
        Serial.println("RTC lost confidence in the DateTime!");
    }

    //delay(5000); // five seconds
}

#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt)
{
    char datestring[20];

    snprintf_P(datestring, 
            countof(datestring),
            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
            dt.Month(),
            dt.Day(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
 //   Serial.print(datestring);
  
  String dateAndTime = datestring;
  //String dateAndTime = datestring+" "+hours;
  
  tft.setTextSize(2);
  char charBuf[25];
  dateAndTime.toCharArray(charBuf, 25);
  
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.drawCentreString(charBuf,240,25,2);
}


//void readSensor()
//{
//  previousIndoorTemperature = indoorTemperature;
//  previousIndoorHumidity = indoorHumidity;
//  
//  indoorHumidity = dht.readHumidity();
 // indoorTemperature = dht.readTemperature();
 // Serial.println(indoorTemperature);
//  Serial.println(indoorHumidity);
//}
void printBodem()
{


  if (uiState ==2)
 { String bodemvocht;
  if((bodem != previousbodem) || (uibodem != 1))
  {
    bodemvocht = String(bodem,1);
    
    if (bodem <= 250){
    DisplayWords = "Droog !";
  } 
  else if (bodem >= 400){
    DisplayWords = "Te Nat!";
  } 
  else {
    DisplayWords = "Goed";
  }


    tft.fillRect(20,232,180,40,TFT_BLACK);
  
    tft.setCursor(20,234);
    tft.setTextColor(TFT_YELLOW);
    tft.setTextSize(5);
    tft.print(bodem);

    
     tft.fillRect(20,167,180,40,TFT_BLACK);
  
    tft.setCursor(20,167);
    tft.setTextColor(TFT_YELLOW);
    tft.setTextSize(5);
    tft.print(DisplayWords);
  }
}
}

void printKasTemperature()
{
  String temperature;
  if((uitempkas != 1) || (tempkas != previoustempkas))
  //if(tempkas != previoustempkas)
  {
    if(humkas == 0.0 && tempkas == 0.0) //We just booted up
    {
      temperature = "---";
    }else
    {
          temperature = String(tempkas,1);
    }

    tft.fillRect(270,232,120,40,TFT_BLACK);
  
    tft.setCursor(270,234);
    tft.setTextColor(TFT_CYAN);
    tft.setTextSize(5);
    tft.print(temperature);

    previoustempkas = tempkas;
    uitempkas = 1;
  }
}

void printRemoteHumidity()
{
  String humidity;
  if((humbuiten != previoushumbuiten) || (uihumbuiten != 1))
  {
    if(humbuiten == 0.0 && tempbuiten == 0.0) //We just booted up
    {
      humidity = "---";
    }else
    {
          humidity = String(humbuiten,1);
    }
    
    tft.fillRect(20,167,120,40,TFT_BLACK);
  
    tft.setCursor(20,167);
    tft.setTextColor(TFT_GREEN);
    tft.setTextSize(5);
    tft.print(humidity);

    previoushumbuiten = humbuiten;
    uihumbuiten = 1;
  }
}

void printRemoteTemperature()
{
  String temperature;
  if((tempbuiten != previoustempbuiten) || (uitempbuiten != 1))
  {
    if(humbuiten == 0.0 && tempbuiten == 0.0) //We just booted up
    {
      temperature = "---";
    }else
    {
          temperature = String(tempbuiten,1);
    }
    
    tft.fillRect(20,232,120,40,TFT_BLACK);
  
    tft.setCursor(20,234);
    tft.setTextColor(TFT_GREEN);
    tft.setTextSize(5);
    tft.print(temperature);

    previoustempbuiten = tempbuiten;
    uitempbuiten = 1;
  }
}

void printKasHumidity()
{
   if((humkas != previoushumkas) || (uihumkas != 1))
  {

    String humidity = String(humkas,1);

    tft.fillRect(270,167,120,40,TFT_BLACK);
  
    tft.setCursor(270,167);
    tft.setTextColor(TFT_CYAN);
    tft.setTextSize(5);
    tft.print(humidity);

    previoushumkas = humkas; 
    uihumkas = 1;
  }
}

dit is de besturing/zender de UNO:

#include <DHT.h>



#define DHTbuitenPIN 2                       // what pin we're connected to
#define DHTbuitenTYPE DHT22                  // DHT 22  (AM2302)
DHT dhtbuiten(DHTbuitenPIN, DHTbuitenTYPE);  //// Initialize DHT sensor for normal 16mhz Arduino
#define DHTkasPIN 13                          // what pin we're connected to
#define DHTkasTYPE DHT22                     // DHT 22  (AM2302)
DHT dhtkas(DHTkasPIN, DHTkasTYPE);           //// Initialize DHT sensor for normal 16mhz Arduino

//pins
int raam_oL_pin = 9;
int raam_oN_pin = 10;
int raam_dL_pin = 7;
int raam_dN_pin = 8;
int ventilator_pin = 11;
int com_act_pin = 13;
int LDRInput = A0;                           //Set Analog Input A0 for LDR.
int thresholdUp = 400;
int thresholdDown = 250;
int soilPin = A1;
int soilPower = 3;//Variable for Soil moisture Power

unsigned long motorMillis = millis();
unsigned long raamMillis = millis();
unsigned long dnMillis = millis();
unsigned long tempMillis;
unsigned long bodemMillis = millis();
unsigned long serialMillis;
// funties
void temperaturen();
//void display(String currState);
void dagnacht();
void raamstate(String currState);
void serial();  //com
//void motor();
void bodemvocht();

//Variables
float ms;
int chk;
float humbuiten;   //Stores humidity value
float tempbuiten;  //Stores temperature value
float humkas;      //Stores humidity value
float tempkas;     //Stores temperature value
float dn;
float rs = 0;
float tempC = 0;  //com
float bodem;

char text[20];    //com
char charVal[6];  //com


void setup()
{
  pinMode(LDRInput, INPUT);
pinMode(raam_oL_pin, OUTPUT);
pinMode(raam_oN_pin, OUTPUT);
pinMode(raam_dL_pin, OUTPUT);
pinMode(raam_dN_pin, OUTPUT);
pinMode(ventilator_pin, OUTPUT);
pinMode (com_act_pin, OUTPUT);
//pinMode(12, OUTPUT);
  digitalWrite (raam_oL_pin, HIGH);
  digitalWrite (raam_oN_pin, HIGH);
  digitalWrite (raam_dL_pin, HIGH);
  digitalWrite (raam_dN_pin, HIGH);
  digitalWrite (ventilator_pin, HIGH);
//  digitalWrite (12, HIGH);
  pinMode(soilPower, OUTPUT);//Set D7 as an OUTPUT
  digitalWrite(soilPower, LOW);//Set to LOW so no power is flowing through the sensor
  digitalWrite (com_act_pin, HIGH);

  Serial.begin(9600);
  dhtbuiten.begin();
  dhtkas.begin();
}

void loop()
{
  temperaturen();
  dagnacht();
  raamstate();
  serial();
  bodemvocht();
}

void temperaturen()

{
  static unsigned long tempMillis = millis();
  if (millis() - tempMillis > 5000)
  {  //Read data and store it to variables hum and temp
    humbuiten = dhtbuiten.readHumidity();
    tempbuiten = dhtbuiten.readTemperature();
    humkas = dhtkas.readHumidity();
    tempkas = dhtkas.readTemperature();
    tempMillis = millis();
  }
}

void dagnacht()
{
  //static unsigned long dnMillis = millis();

  if (millis() - dnMillis > 10000)
  {
    int value = analogRead(LDRInput);  //Reads the Value of LDR(light).
//    Serial.println(value);
    if (value < 400)
    {
      dn = 1;
    }
    else
    {
      dn = 2;
    }
    dnMillis = millis();
  }
}

void raamstate()
{
  static unsigned long raamMillis = millis();
  static uint16_t raamdelay;
  enum class raamstate:uint8_t
  {
    open,        //default 0
    dicht,       // default 1
    ventilatie,  // default 2
    reset,  // default 3 }
  };
  
  static raamstate currState = raamstate::reset;
 
  switch (currState)
  {

    case raamstate::dicht:
 //     Serial.println ("raam dicht");
      if ((millis() - raamMillis > 50000) && (tempkas > 30) && (dn == 2) && (rs != 1))
      {
        rs = 1;
        Serial.println("Raam gaat open");
        digitalWrite(raam_oL_pin, LOW);
        digitalWrite(raam_oN_pin, LOW);
 //       motorloop = 1;
        Serial.println("ventilator aan");
        digitalWrite(ventilator_pin, LOW);
        delay(120000);
        digitalWrite(raam_oL_pin, HIGH);
        digitalWrite(raam_oN_pin, HIGH);
        Serial.println("Raam open");
        currState = raamstate::open;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 50000) && (humkas > 75) && (tempkas> 20) && (dn == 2) && (rs != 1))
      {
        rs = 1;
        Serial.println("raam gaat naar ventilatie");
        digitalWrite(raam_oL_pin, LOW);
        digitalWrite(raam_oN_pin, LOW);
        //motorloop = 2;
        Serial.println("ventilator aan");
        digitalWrite(ventilator_pin, LOW);
        delay(50000);
        digitalWrite(raam_oL_pin, HIGH);
        digitalWrite(raam_oN_pin, HIGH);
        Serial.println("Raam op ventilatie");
        currState = raamstate::ventilatie;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 50000) && (humkas > 50) && (tempbuiten > 25) && (dn == 1 && rs != 1))
      {
        rs = 1;
        Serial.println("raam gaat naar ventilatie");
        digitalWrite(raam_oL_pin, LOW);
        digitalWrite(raam_oN_pin, LOW);
//        motorloop = 2;
        delay(50000);
        digitalWrite(raam_oL_pin, HIGH);
        digitalWrite(raam_oN_pin, HIGH);
        Serial.println("Raam op ventilatie");
        currState = raamstate::ventilatie;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 50000) && (tempkas > 30) && (tempbuiten > 20) && (dn == 1 && rs != 1))
      {
        rs = 1;
        Serial.println("raam gaat open");
        digitalWrite(raam_oL_pin, LOW);
        digitalWrite(raam_oN_pin, LOW);
//      motorloop = 1;
        delay(120000);
        digitalWrite(raam_oL_pin, HIGH);
        digitalWrite(raam_oN_pin, HIGH);
        Serial.println("Raam open");
        currState = raamstate::open;
        raamMillis = millis();
      }

      break;

    case raamstate::open:
//      Serial.println ("raam open");
      if ((millis() - raamMillis > 50000) && (tempkas < 20) && (rs != 2))
      {
        rs = 2;
        Serial.println("raam gaat dicht");
        digitalWrite(raam_dL_pin, LOW);
        digitalWrite(raam_dN_pin, LOW);
 //       motorloop = 3;
        Serial.println("ventilator uit");
        digitalWrite(ventilator_pin, HIGH);
        delay(130000);
        digitalWrite(raam_dL_pin, HIGH);
        digitalWrite(raam_dN_pin, HIGH);
       // Serial.println("Raam dicht");
        raamMillis = millis();
        currState = raamstate::dicht;
      }
      else
      {
        if ((millis() - raamMillis > 50000) && (dn == 1) && (rs != 2) && (tempbuiten < 20))
        {
          rs = 2;
          Serial.println("raam gaat dicht ivm nacht");
        digitalWrite(raam_dL_pin, LOW);
        digitalWrite(raam_dN_pin, LOW);
 //        motorloop = 3;
         Serial.println("ventilator uit");
         digitalWrite(ventilator_pin, HIGH);
         delay(130000);
         digitalWrite(raam_dL_pin, HIGH);
         digitalWrite(raam_dN_pin, HIGH);
          Serial.println("Raam dicht");
          raamMillis = millis();
          currState = raamstate::dicht;
        }
      }
      break;

    case raamstate::ventilatie:
//      Serial.println("ventilatie");
      if ((millis() - raamMillis > 50000) && (humkas < 50) && (tempkas < 25) && (rs != 3))
      {
        rs = 3;
        Serial.println("raam van ventilatie naar dicht");
        digitalWrite(raam_dL_pin, LOW);
        digitalWrite(raam_dN_pin, LOW);
 //     motorloop = 3;
        Serial.println("ventilator uit");
        digitalWrite (ventilator_pin, HIGH);
        delay(51000);
        digitalWrite (raam_dL_pin, HIGH);
        digitalWrite (raam_dN_pin, HIGH);
        //Serial.println("Raam dicht");
        currState = raamstate::dicht;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 50000) && (humkas > 50) && (tempkas > 30) && (dn == 2) && (rs != 3))
      {
        Serial.println("raam van ventilatie naar open");
        digitalWrite(raam_oL_pin, LOW);
        digitalWrite(raam_oN_pin, LOW);
 //      motorloop = 1;
        Serial.println("ventilator aan");
        digitalWrite(ventilator_pin, LOW);
        delay(97000);
        digitalWrite (raam_oL_pin, HIGH);
        digitalWrite (raam_oN_pin, HIGH);
      //Serial.println("Raam open");
        currState = raamstate::open;
        raamMillis = millis();
      }
      else if ((millis() - raamMillis > 50000) && (dn == 1) && (rs != 3) && (tempbuiten < 20))
      {
        rs = 3;
        Serial.println("raam gaat dicht ivm nacht");
        digitalWrite(raam_dL_pin, LOW);
        digitalWrite(raam_dN_pin, LOW);
 //       motorloop = 3;
        //Serial.println("ventilator uit");
        digitalWrite(ventilator_pin, HIGH);
        delay(51000);
        digitalWrite(raam_dL_pin, HIGH);
        digitalWrite(raam_dN_pin, HIGH);
       //Serial.println("Raam dicht");
        raamMillis = millis();
        currState = raamstate::dicht;
      }
      break;
  
  case raamstate::reset:
      Serial.println ("raam reset");
      if ((millis() - raamMillis > 5000) && (rs != 2))
      {
        rs = 2;
        Serial.println("raam gaat dicht");
        digitalWrite(raam_dL_pin, LOW);
        digitalWrite(raam_dN_pin, LOW);
//        Serial.println("ventilator uit");
        digitalWrite(ventilator_pin, HIGH);
        delay(130000);
        digitalWrite(raam_dL_pin, HIGH);
        digitalWrite(raam_dN_pin, HIGH);
        raamMillis = millis();
        currState = raamstate::dicht;
      }
      break;
  } 
}
void serial()
{static unsigned long serialMillis = millis();
  if (millis() - serialMillis > 15000)
  {
    
  digitalWrite (com_act_pin, HIGH);
  delay(200);
  
    Serial.print("<");
    Serial.print(humbuiten);
    Serial.print(",");
    Serial.print(tempbuiten);
    Serial.print(",");
    Serial.print(humkas);
    Serial.print(",");
    Serial.print(tempkas);
    Serial.print(",");
    Serial.print(bodem);
    Serial.print(">");
 
    serialMillis = millis();
//  delay(2000);
//      digitalWrite (com_act_pin, LOW);    
  }
  
}

void bodemvocht()
{
  String DisplayWords;
static unsigned long bodemMillis = millis();
  
  if (millis() - bodemMillis > 25000)
  {
  int sensorValue;
    digitalWrite(soilPower, HIGH);//turn D7 "On"
    delay(10);//wait 10 milliseconds 
    sensorValue = analogRead(soilPin);//Read the SIG value form sensor 
    digitalWrite(soilPower, LOW);//turn D7 "Off"
  //Serial.write("Water Level: ");
  //Serial.print(sensorValue); //Using .print instead of .write for values
  bodem = sensorValue;
  bodemMillis = millis();

  if (sensorValue <= thresholdDown){
    DisplayWords = "Dry, Water it!";
 //   Serial.print(DisplayWords);
    bodemMillis = millis();
  } else if (sensorValue >= thresholdUp){
    DisplayWords = "Wet, Leave it!";
 //   Serial.print(DisplayWords);
    bodemMillis = millis();

  } else {
  //  Serial.print(DisplayWords);
    bodemMillis = millis();
  }
  }
  //delay(500); //wait for half a second, so it is easier to read
}

Wat is de functie van de verschillende uiXXX variabelen in de Mega code? Ik vermoed dat die moeten aangeven of iets op het scherm gezet moet worden of niet.

Indien dat inderdaad zo is, is een float het allerlaatse dat je wilt gebruiken. Als er slechts 2 mogelijkheden zijn moet je eigenlijk een bool gebruiken en als er meer zijn een integer variabele.

Wat is de betekenis van de waardes 1 en 2 voor de uiXXX variabelen?

Idd om te bepalen welke waardes moeten worden afgebeeld op het display.
Dus dat zal ik veranderen in een bool dus.

Maar mijn grootste euvel nu is dat de uno dus niet mijn raam aanstuurd maar wel de rest doet wat hij moet doen.

Heeft deze regel invloed op het gebeuren? Misschien iets verkeerd?

oud:

else if ((millis() - raamMillis > 5000) && (humkas > 50) && (dn == 2) && (rs != 1))

nieuw:

else if ((millis() - raamMillis > 50000) && (humkas > 75) && (tempkas > 20) && (dn == 2) && (rs != 1))

Het is het enige verschil dat ik gevonden heb in de raamstate() functie (afgezien van de 50000 vs 5000).

//edit
Check DHTkasPIN en com_act_pin; lijkt er op dat je dezelfde pin gebruikt.

Ja heb volgens mij met veranderen van pin nummers naar benamingen wat verkloot met de pun nummers🙈 was daar straks nog ff bezig geweest ( testen door meetwaardes en variabelen manipuleren)en het leek begeven moment net een flipperkast. Maar moes mijn vroutje weer gaan ophalen bij de dialyse. Dus voor de veiligheid maar ff de spanning er af gegooit.
Ga zo nog eens ff voor zitten en alles nog x na lopen tegen de vorige versie.
Update volgd nog

Nou alle pinnen nagelopen en hersteld, verbrande transformator voor de externe besturing vervangen en nu ook maar voorzien van een extra glaszekering om herhaling te voorkomen.
Nog foutje uit mijn raamstate gehaald en nu weer aan het testen.

Meteen vraagje voor mijn vervolg. Heb dus rs485 comunicatie nu. Nu verstuur ik met de uno waardes naar mega. De verzonde waardes begint met < en eindigt met >.
Als ik nu andere waardes met een 2de uno op de zelfde lijn ga verzenden moet ik dan simpel weg de < > vervangen voor bijvoorbeeld \ / als begin en end marker?

Houdt dat in dat je nu 3 Arduinos hebt? In dat geval moet je een beetje voorzichtig zijn dat de twee Unos niet op hetzelfde moment data versturen. Als dat gebeurt krijg je data corruptie. Je kunt wat zoeken op het web naar de engelse term data collision in combinatie met rs485.

Het idee achter RS485 is dat je een master/slave setup gebruikt; als de ontvanger (master) gegevens nodig heeft stuurt deze een bericht naar de zenders (slaves); in dat bericht zit een veld (numeriek is het handigste) dat aangeeft welke slave de gegevens moet leveren.

Alle slaves lezen dat bericht maar alleen de slave die dat nummer herkent zal de gegevens versturen. De master weet welk nummer verstuurd is dus weet waar de gegevens vandaan (zouden moeten) komen. De slave kan ook ook zijn nummer in het antwoord zetten zodat de master het kan controleren.

Het onderstaande voorbeeld is bv voor twee kassen waar de zender dezelfde gegevens verstuurt; de eerste kolom geeft aan wat de master stuurt, de tweede en derde kolom geven aan welke slave de gegevens verstuurt en de zelf gegevens.

mega uno1 uno2
<1>
<1,humbuiten,tempbuiten,...>

of

mega uno1 uno2
<2>
<2,humbuiten,tempbuiten,...>

Komt nu idd een 3e arduino bij. Nog een uno.
Maar ben nu al van af gister weer aan het zoekken. Maar kom nergens een goed overzichtelijk voorbeeldje tegen hier voor.
Heb gezocht op rs485 multiple divices en dsta colision. En nog wat andere. Maar kom hoofdzakelijk dan bij mod bus en dat soort dingen uit.
Toen ik net begon met dit verhaal hier stond er op het forum eentje die met deze manier van comunicatie bezig was . dat was mooi voorbeeld voor me geweest maar die krijg ik ook nog steeds niet terug gevonden hier nu.
Heb of weet jij zo een overzichtelijk voorbeeldje voor master en slave?

Één van mijn "goto" sites voor arduino zaken is Nick Gammon's site. Als je zoekt en je voegt het woord gammon toe kun je vaak zinvolle informatie vinden met betrekking tot Arduino. Onderstaande link voor RS485.

https://www.gammon.com.au/forum/?id=11428

dat was de perfecte verwijzing.
na wat denk werk en ook met het oogpunt op een uitbreiding van functies en eventueel nog verder uit kunnen bouwen later ben ik op het "rolling master idee van hem beland.
denk dat ik dan het kas besturings deel beter helemaal opnieuw in een andere vorm moet schrijven ivm de zeer lange delay's die daar nu in zitten zolang de raam motor loopt.
aangezien die UNO nog steeds meerdere keren per dag vast loopt misschien maar beter ook.

nu heeft hij daar een duidelijke code geschreven. maar heb daar toch paar kleine vraagtekens in.

hij zegt
"In the example there is the device address (needed so we know which device it is) followed by an array of 10 bytes (eg. these could be 10 switch positions) plus another "status" integer, which might be the result of reading from a light sensor."
en dan in de code heb je de toe wijzing
`byte switches [10];
ik heb bv van mijn kas 2 temperaturen, 2 vochtigheid, bodemvocht en stand van de raam.
temperaturen is met 2 decimalen de vochtigheid ook. bodemvocht is in de 100 met 2 decimalen en raam stand is 1 tot 3.
is dit dan 14 byte? of moet ik dat anders tellen?

en hier pakt hij de te verzenden waardes:

// Here to send our own message
void sendMessage ()
{
digitalWrite (SEND_PIN, HIGH);
memset (&message, 0, sizeof message);
message.address = myAddress;

// fill in other stuff here (eg. switch positions, analog reads, etc.)

message.switches [0] = digitalRead (SWITCH_PIN);

kan ik hier bv =(data1), (data2), (Data3);
of hoe moet ik die waardes scheiden?
denk als ik dit duidelijk heb ik het wel werkend moet gaan krijgen.

Dat hangt er van af. Als een temperatuur -5 graden is en je stuurt dat als tekst (zoals je dat in je huidige programma doet) met twee decimalen, verstuur je -5.00 en dat is 5 karakters. Op dezelfde wijze is een vochtigheid van 100% 100.00 en dus 6 karakters.

Als je rauwe data verstuurt is een float 4 bytes en een int 2 bytes. De grootte van een int hangt af van de processor; 16 bits (2 bytes) voor 8-bit processors, 32 bits (4 bytes) voor 32-bit processors; jouw Mega en Uno hebben een 8-bit processor (en uit dezelfde familie hetgeen belangrijk is voor het onderstaande idee).

Dit is the struct in het voorbeeld

struct
  {
  byte address;
  byte switches [10];
  int  status;
  }  message;

Die kun je veranderen naar

struct
  {
  byte address;
  float tempBuiten;
  float tempBinnen;
  float humBuiten;
  float humBinnen;
  float humSoil;
  uint8_t raamstand;
  int  status;
  }  message;

Je kunt nu direct de velden van de struct invullen in de senMessage().

Ik noemde eerder het belang van dezelfde familie. Sommige processor families sturen een16-bit integer (2 bytes) in de volgorde meest significant, minst significant en andere processor families sturen het in de omgekeerde volgorde. Ik denk dat dit ook geldt voor floats (4 bytes).
Als je ooit bv een Due gaat gebruiken in plaats van een Mega kun je problemen tegen komen; die zijn oplosbaar maar je moet het wel even weten.

Als je gegevens als tekst verstuurt kom je die problemen niet tegen; de eventuele omzetting naar de numerieke waarde (integer, float) zorgt dat het alrtijd goed gaat.

Ik heb geen idee of "rolling master" een betere benadering is dan een benadering waar de master één voor één alle aangesloten Unos om data vraagt; ik denk dat de laatste vele malen eenvoudiger is.

Oké dat is stuk duidelijker nu.
En ik kies voor de rolling master omdat ik dan ook via de mega over write schakelaars voor het raam kan maken.

Verzonden vanaf Outlook voor Android

Dat kan ook zonder "rolling master" :wink:

Oke maar hoe bouw je dat dan op?
Ik had het idee dat die rolling master de perfecte oplossing was.

Eerst moet je een protocol definiëren. Het eerste byte is het adres (in post #11 noemde ik dat nummer). Dat protocol kan er zo uit zien

commando beschrijving
<N,?> Vraag gegevens (temperaturen, vochtigheden, raamstand) van slave met adres N.
<N,R,X> Vertel slave met adres N om het Raam te openen naar positie X of te sluiten (X is 0).
<N,V,X> Vertel slave met adres N om de Ventilator aan te zetten (X is 1) of uit te schakelen (X is 0).

Je implementeert een recvWithStartEndMarker() en een parser in de Uno. Als newData true is splits je het ontvangen bericht. Daarna kijk je eerst of het adres overeenkomt met het adres van de zender, Indien niet, dan doe je niets; indien ja, dan kijk je naar het commando (?/R/V).

  1. Als je een ? ontvangt roep je je bestaande serial() aan en stuur je de gegevens zoals je nu doet.
  2. Als je een R of V ontvangt roep je een functie aan die de gewenste actie uitvoert met als parameter de waarde van X. Als die actie klaar is stuur je een antwoord terug naar de master om aan te geven of er fouten waren of niet. bv <1,R,0> betekent dat het raam commando succesvol was uitgevoerd en <1,R,-1> betekent dat er een fout was (bv raam positie 999 ontvangen als je maar drie raam posities hebt).

Het verdere voordeel van het versturen van een antwoord voor (2) is dat er een consistentie is in het protocol (altijd commando/andwoord) en dat de master weet dat het commando ontvangen was.

Aan de master kant (Mega) kun je nu de commandos sturen zoals in de tabel hierboven. Bv <1,?> om de gegevens van Uno 1 op te vragen en <2,R,1> om het raam van Uno 2 op positie 1 te zetten. De master weet welk commando gestuurd is en dus wat voor antwoord te verwachten; als je een ? gestuurd had weet je dat het antwoord de data bevat en als je een V stuurt weet je dat de het antwoord betrekking heeft op dat commando.

Ik hoop dat het een beetje duidelijk is.

Voordat je met dit alles begint zou ik echter eerst proberen erachter te komen waarom de Uno (zender) hangt (als dat nog steeds gebeurt). Het heeft weinig zin alles uit te breiden. Kan het hangen een resultaat zijn van de lange delays die je gebruikt? Of misschien is er een relatie met het aansturen van her raam of de ventilator?

Zeker hele duidelijke uitleg. Dank je
En ja ik vermoed wel dat het misgaat door de delays.
Ga eerst eens het stuur gedeelte van het raam op een andere manier opstellen. Kijken wat dat doet.
En idd dan pas weer verder uitbreiden