Hallo zusammen
Ich möchte euch ein Projekt vorstellen, welches ich plane zu verbauen.
Ich darf vermutlich für unsere Gemeinde eine neue Wasserstandsanzeige installieren, da die alte Anlage den Dienst nicht mehr ausführt… und auch nie richtig ausgeführt hat. Und als ambitionierter Handwerker (ursprünglich gelernter Elektromonteur) bin ich der Meinung, dass ein Arduino auf günstige Art und Weise absolut geeignet ist dafür.
Im Detail handelt es sich um einen unterirdischen Wassertank einer Waldhütte mit zirka 2000l Kapazität, aus welchem der Füllstand mittels entsprechender Anlage auszulesen ist. Realisieren möchte ich die Anlage so, dass sich 4 Schwimmerschalter im Wassertank befinden und den Wert (1/0) jeweils dem Arduino mitteilen. Die Leitungslänge wird bei geschätzt 10m liegen, aber das sollte Widerstandstechnisch theoretisch kein Problem darstellen. Der Arduino zeigt den Füllstand anschliessend per LED (in meinem Fall die Grove Led Bar) an. Weiter wird bei einer Niveauveränderung eine SMS an mich versendet, damit ich weiss, wann der Wassertank wieder aufzufüllen ist.
Soweit die Theorie.
Ich habe den Anfängercrashkurs mit dem Arduino soweit bestanden und habe bereits ein paar einfache Programme selbst geschrieben, die auch gut funktioniert haben. Den Code für die Füllstandsanlage habe ich nun beinahe fertig geschrieben, nur die SMS Funktion möchte ich jetzt „einpflanzen“. Ihr werdet im Code bemerken, dass ich viel mit delay’s gearbeitet habe. Meine Idee dahinter ist, dass der Schwimmerschalter damit „entprellt“ wird und ich nicht 10 SMS für eine einzige Niveauveränderung erhalte, falls der Schwimmer wackelt. Womöglich lässt sich das Problem auch mit der millis() Funktion beheben, aber das ist für meine Stufe noch ein wenig zu hoch. Ausserdem läuft das Programm mit den delay’s zufriedenstellend für mich, sodass ich es vermutlich in dieser Hinsicht nicht verändern werde.
Ich habe mir nun ein Arduino GSM Shield 2 besorgt, damit ich die SMS Funktion realisieren kann. Die ersten Tests haben auch gut funktioniert damit (Danke nochmals für die Hilfe im Forum). Nun stellt sich ein weiteres, mir unverständliches Problem in den Weg:
Wenn sich gemäss dem angehängten Code das Niveau unter „Voll“ senkt, bekomme ich eine SMS mit der Mitteilung „Wasserstand von Voll gesunken“ und im Serial Monitor ebenfalls die Benachrichtigung. Wenn sich das Niveau nun aber wieder auf „Voll“ erhebt, bekomme ich keine entsprechende SMS. Und das ist das Problem, welches ich nicht verstehe. Ich habe im Code diverse „ok“ per Serial Monitor eingeschrieben, damit ich sehe, wo das Programm hängen bleibt. Tatsächlich bleibt der Code bei „sms.endSMS();“ bei der Mitteilung „Wasserstand komplett gefuellt“ hängen. Gemäss den „ok“ sehe ich das im Serial Monitor. An was könnte das liegen?
Sorry für den Aufsatz, aber ich möchte euch ein gutes Bild von meinem Projekt geben.
#include <Grove_LED_Bar.h>
#include <GSM.h>
Grove_LED_Bar bar(8, 9, 0); // Clock pin, Data pin, Orientation
GSM gsmAccess;
GSM_SMS sms;
const int SchwimmerEinviertel = 4;
const int SchwimmerHalbvoll = 5;
const int SchwimmerDreiviertel = 6;
const int SchwimmerVoll = 7;
const int LedStoerung = 10;
int Umschalter1 = 0;
int Umschalter2 = 0;
int Umschalter3 = 0;
int Umschalter4 = 0;
int SchwimmerzustandEinviertel;
int SchwimmerzustandHalbvoll;
int SchwimmerzustandDreiviertel;
int SchwimmerzustandVoll;
char NatelNummer[20] = "0781234567";
void setup(){
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(10,OUTPUT);
bar.begin();
Serial.begin(9600);
while (!Serial) {}
Serial.println("Wassenstandsanlage wurde neu gestartet aufgrund Wartung oder Stromausfall");
boolean notConnected = true;
while (notConnected) {
if (gsmAccess.begin() == GSM_READY) {
notConnected = false;}
else {Serial.println("Not connected");
delay(1000);}}
Serial.println("GSM Bereit");
sms.beginSMS(NatelClaudio);
sms.print("ok");
sms.endSMS();
}
void loop(){
SchwimmerzustandEinviertel = digitalRead(SchwimmerEinviertel);
SchwimmerzustandHalbvoll = digitalRead(SchwimmerHalbvoll);
SchwimmerzustandDreiviertel = digitalRead(SchwimmerDreiviertel);
SchwimmerzustandVoll = digitalRead(SchwimmerVoll);
char NatelNummer[20] = "0781234567";
//Nachfolgend der oberste Schwimmer:
if (SchwimmerzustandVoll == HIGH){
bar.setLevel(10);}
else {bar.setLevel(0);}
if (SchwimmerzustandVoll == LOW && Umschalter4 == 0) {
Umschalter4 = 1;
delay(5000);
Serial.println("Von Voll gesunken");
char VonVollgesunken[200] = "Wasserstand von Voll gesunken";
Serial.println("ok");
sms.beginSMS(NatelNummer);
Serial.println("ok");
sms.print(VonVollgesunken);
Serial.println("ok");
sms.endSMS();
Serial.println("ok");}
else if (SchwimmerzustandVoll == HIGH && Umschalter4 == 1) {
Umschalter4 = 0;
delay(5000);
Serial.println("Komplett gefüllt");
char Komplettgefuellt[200] = "Wasserstand gefuellt";
Serial.println("ok");
sms.beginSMS(NatelNummer);
Serial.println("ok");
sms.print(Komplettgefuellt);
Serial.println("ok");
sms.endSMS();
Serial.println("ok");}
//Nachfolgend der zweitoberste Schwimmer:
if (SchwimmerzustandDreiviertel == HIGH){
bar.setLevel(7);}
else {bar.setLevel(0);}
if (SchwimmerzustandDreiviertel == LOW && Umschalter3 == 0) {
Umschalter3 = 1;
delay(5000);
Serial.println("Gesunken unter drei Viertel");}
else if (SchwimmerzustandDreiviertel == HIGH && Umschalter3 == 1) {
Umschalter3 = 0;
delay(5000);
Serial.println("Gefüllt auf drei Viertel");}
//Nachfolgend der zweitunterste Schwimmer:
if (SchwimmerzustandHalbvoll == HIGH){
bar.setLevel(5);}
else {bar.setLevel(0);}
if (SchwimmerzustandHalbvoll == LOW && Umschalter2 == 0) {
Umschalter2 = 1;
delay(5000);
Serial.println("Gesunken unter Halbvoll");}
else if (SchwimmerzustandHalbvoll == HIGH && Umschalter2 == 1) {
Umschalter2 = 0;
delay(5000);
Serial.println("Gefüllt auf Halbvoll");}
//Nachfolgend der unterste Schwimmer:
if (SchwimmerzustandEinviertel == HIGH){
bar.setLevel(3);}
else {bar.setLevel(1);
delay(300);
bar.setLevel(0);
delay(300);}
if (SchwimmerzustandEinviertel == LOW && Umschalter1 == 0) {
Umschalter1 = 1;
delay(5000);
Serial.println("Gesunken unter ein Viertel. Tank auffüllen!");}
else if (SchwimmerzustandEinviertel == HIGH && Umschalter1 == 1) {
Umschalter1 = 0;
delay(5000);
Serial.println("Gefüllt auf ein Viertel");}
//Nachfolgend die Störungskriterien:
if (SchwimmerzustandEinviertel == 0 && SchwimmerzustandHalbvoll == 1) {
digitalWrite(LedStoerung,HIGH);}
else if (SchwimmerzustandHalbvoll == 0 && SchwimmerzustandDreiviertel == 1) {
digitalWrite(LedStoerung,HIGH);}
else if (SchwimmerzustandVoll == 1 && SchwimmerzustandDreiviertel == 0) {
digitalWrite(LedStoerung,HIGH);}
else {digitalWrite(LedStoerung,LOW);}
}
Serial Monitor Auszug:
Wassenstandsanlage wurde neu gestartet aufgrund Wartung oder Stromausfall
GSM Bereit
Von Voll gesunken
ok
ok
ok
ok
Komplett gefüllt
ok
ok
ok (Hier bliebt es bei sms.endSMS() hängen)
Arduino: Uno
GSM Shield 2: https://www.distrelec.ch/de/arduino-gsm-shield-a000106-arduino-a000106/p/30078155
Grove Led Bar: Grove - LED Bar | Seeed Studio Wiki