Sketch stoppt für 60 Sek und läuft weiter

Hallo,
ich lese mit meinem Sketch einen Bodenfeuchtesensor (SoMoSe V2.2). Wenn der durch ein Poti vorgegebene Wert unterschritten wird (Boden zu trocken) wird mit Blynk eine Nachricht gesendet.
Das klappt alles weitestgehend.. Das Programm stoppt immer im Unterprogramm "Feuchte", wenn dort das Unterprogramm "Poti" aufgerufen wird. Die serielle Ausgabe "in UP Poti" erfolgt noch, dann bleibt es für ca 65 Sek. stehen und läuft dann weiter.
Hat jemand eine Idee, was der Grund sein könnte?

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 Dateiname: Rasen_150424_mit_OLED und Arduino Nano 33 IoT
 Stand 19.04.2024 : Anzeige OLED = ja
                    Einstellung Poti = ja
                    Sensor1 Online_Anzeige = ja
                    Benachrichtigung = ja
++++++++++++++++++++++++++ Def Blynk  +++++++++++++++++++++++++++++++++++++*/
#define BLYNK_TEMPLATE_ID "TMPL4lGlxHvHc"
#define BLYNK_TEMPLATE_NAME "Feuchte Rasen"
#define BLYNK_AUTH_TOKEN "yyyyyyyyyyyyyyyyyyyyyyyyy"  //Sensor1
//#define BLYNK_AUTH_TOKEN "zzzzzzzzzzzzzzzzzzzzzzzzzzz"  //Sensor2
//++++++++++++++++++++++++ Def OLED ++++++++++++++++++++++++++++++++++++++++
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ads;  // Create an instance of the ADS1115
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int nass = 0;            // map Poti
const int trocken = 1024;      // 1024 map Poti
unsigned long intervall = 10000; // Messung alle 10 min
unsigned long myTime = 0;
unsigned long tdiff = 0;
int Potip = 0; // Potiwert in %
int intervall2= 50; // 50 messungen für Berechnung Duchschnitt
int Sensorwert1 = 0;
int Sensorwert2 = 0;
int Sensoren_max = 850; // Sensorwert bei 100% Feuchte (z.B. Sensor im Wasserglas)
int Grenzwert = 0; // Potieinstellung 
int adc0; // digitaler Wert von A0 des Sensor1
int adc1; // digitaler Wert von A1 des Sensor2
int adc0_1 = 0;
int adc1_1 = 0;
char auth[] = BLYNK_AUTH_TOKEN;
//+++++++++++++++++++++ WLAN ++++++++++++++++++++++++++++++++++
char ssid[] = "XXXXXXX";
char pass[] = "YYYYYYYYYYY";
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BlynkTimer timer;
//##############################################################
void Poti()
{
  Serial.println("in UP Poti");
  int Potiwert = analogRead(A2); // Poti Mittelabgriff
  Grenzwert = Potiwert;
// Wert Poti in % umrechnen
  Potip = map(Potiwert,nass, trocken,0,100);
}
//################### Unterprogramm Feuchte ####################
void Feuchte() 
{
  Serial.println("in UP Feuchte");
  unsigned long aktTime = millis();
  unsigned long tdiff = aktTime - myTime;
  //zahl = 0;
    if (tdiff >= intervall) // wenn intervall erreicht
    {
      Sensor1 ();
      Sensor2 ();
      myTime = aktTime;
    }
Poti();
// Send the readings to Blynk virtuelPin V0 und V1
  Blynk.virtualWrite(V0, Sensorwert1); //aus UP Sensor1
  Blynk.virtualWrite(V1, Sensorwert2); // aus UP Sensor2
  //sendet WARNUNG an Smartphone wenn Rasen zu trocken
   if (Sensorwert1 < Potip)
  {
    int f = Sensorwert1; 
    //trigger the notification 
     Blynk.logEvent("under_feuchte_alert",  String("Der Boden ist trocken Sensor 1 ") + f);
  }
   if (Sensorwert2 < Potip)
  {
     int f = Sensorwert2; 
    //trigger the notification 
     Blynk.logEvent("under_feuchte_alert",  String("Der Boden ist trocken Sensor 2 ") + f);  
  }
}
//############################# ENDE Feuchte ######################
//################### Sensor 2 ###############################
void Sensor2()
{
  for (int i=0; i <= intervall2; i++)
  {
        Anzeige(); //zeigt den eingestellten Grenzwert PotiP in % an
        delay(100);
        adc1 = analogRead(A1);  // ließt den Wert des Sensor2
        adc1_1 = adc1_1 + adc1; // Addition der Feuchtewerte
   }
  int Sensorwert2_d = adc1_1/intervall2;
  Sensorwert2 = map(Sensorwert2_d,0,Sensoren_max,0,100); //Feuchte Sensor2 in %
  adc1 = 0;
  adc1_1 = 0;
}
//################### Ende Sensor 2 ############################
//################### Sensor 1 ###############################
void Sensor1()
{
  Serial.println("in UP Sensor1");
  for (int i=0; i <= intervall2; i++)
  {
        Anzeige(); //zeigt den eingestellten Grenzwert PotiP in % an
        Serial.println("in for Sensor1");
        delay(100);
        adc0 = analogRead(A0);  // ließt den Wert des Sensor1 
        adc0_1 = adc0_1 + adc0; // Addition der Feuchtewerte
        Serial.print("adc0 = ");
        Serial.println(adc0);        
      
  }
  int Sensorwert1_d = adc0_1/intervall2;
  Sensorwert1 = map(Sensorwert1_d,0,Sensoren_max,0,100); //Feuchte Sensor1 in %
  Serial.print("Sensorwert1 ######################## = ");
  Serial.println(Sensorwert1);
  adc0 = 0;
  adc0_1 = 0;
}
//################### Ende Sensor 1 ############################

//################## Unterprogramm Anzeige  #####################
void Anzeige()
{
  Serial.println("in UP Anzeige");
 char buf[15];
 char feucht;
// Wert Poti in % umrechnen
  Poti();
 feucht = Potip; // hier dann die Variable für Feuchte einsetzen
 //+++++++++++++++++++++ Display ++++++++++++++++++++++++++++++
 // Formatierte Information erstellen:
     display.setTextSize(2);      // Text Größe
     display.clearDisplay();      // Anzeige löschen
     display.setTextColor(WHITE); // Schriftfarbe
    // Cursor positionieren:
    display.setCursor(10, 10);   // Cursorposition
    // Ausgabe der Feuchte:
    display.write("Grenzwert");  // Textausgabe
    display.setCursor(50, 40);   // Cursorposition
    // Ausgabe der Feuchte:
    sprintf(buf, "%d" , feucht); // Textausgabe , hier Zahl
    display.write(buf); 
    display.setCursor(80, 40);   // Cursorposition
    display.write("%");    
    display.display();           // Anzeige ausgeben
    //delay(5000);
}
//################### Ende Anzeige #############################  
//****************************************************************
//****************************************************************
void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
 delay(100);
//+++++++++++++ initialisierung Display +++++++++++++++++++++++++
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    display.display();

 Blynk.begin(auth, ssid, pass);
 // take a reading from the Feuchte sensor every 10 seconds
 timer.setInterval(500L, Feuchte); 
 }
//**************************************************************
//**************************************************************
void loop() 
{
   Feuchte();
  Blynk.run();
  timer.run();
}

Also deine zwei Sensorfunktionen blockieren schon für min. 10 Sekunden, weil in jeder Funktion 50 mal ein delay von 100ms erfolgt. Dein Intervall ist mit 10000 ms angegeben, das kommt sich wahrscheinlich in die Quere weil die zwei Sensorfunktionen etwas länger brauchen.

In deinem Kommentar steht etwas von alle 10Minuten eine Messung…
Das sind aber 1000 x 60 x 10 Millisekunden. Etwas mehr als 10.000ms.

Hab die Zugangsdaten gelöscht;
Trotzdem solltest Du, wAlter67 Dein Password ändern.

Grüße Uwe

Serial.println("in UP Poti");
hier ----->
int Potiwert = analogRead(A2); // Poti Mittelabgriff

Wie kommst Du darauf?

cu

Hallo Uwe,

danke für den Hinweis, habe das PW geändert

Hallo,
der Mittelabgriff ist beim Arduino Nano 33 IoT auf den analogen PIN A2 gelegt.

Ist auch der Poti mit Plus = VCC verbunden?

Hallo Kai,

wenn das Ganze läuft soll nur alle 10 Min gemessen werden, das dauert mir aber in der Testpjase zu lange. Ich hab den Wert jetzt mal auf 30 Sekunden gelegt und die delays herausgenommen.

Zum Testen erstmal auf Lochplatine aufgebaut. Das braune ist der Pegelumwandler 5V -> 3V.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.