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();
}