Hallo ihr Profis =)
Nun ist gestern endlich mein SIM900 Aufsteckmodul für das UNO gekommen und ich habe mich direkt wieder an die Sache gesetzt und meinen "Code" getestet.
Das Ergebnis blieb ernüchternd - es funktioniert wie erwartet nicht richtig.
Ich habe den Code dann mehrmals angepasst, bis ich nun wirklich nicht mehr weiter weiß.
Nochmal kurz zusammengefasst zum Vorhaben:
Das SIM900 soll eine SMS absetzen und eine LED auf PIN 13 soll leuchten, wenn ein Schalter auf PIN 6 geschlossen wird.
Des Weiteren soll der Sketch die Versorgungspannung des Boards (später alle 60min) abfragen und bei Unterschreiten eines Schwellwerts von 10V ebenfalls eine SMS absetzen.
Da ich bislang alles in Eigenregie versucht habe und nicht wirklich weiterkomme, gebe ich die Frage nun an Euch ab.
// Libraries importieren
#include <SoftwareSerial.h>
#include <String.h>
//#include <GSM.h>
//#include <HttpClient.h>
SoftwareSerial mySerial(7, 8);
int led = 13; // Pin der LED
int refresh = 3000; // Messung alle 30min wiederholen
int adc_low, adc_high; // Zwischenspeicher für die Ergebnisse des ADC
long adc_result; // Gesamtergebnis der Messung des ADC
long vcc; // Versorgungsspannung
int Led_Pin = 13; // Pin für LED-Status (Digital-Pin 13)
int REED_Pin = 6; // Sensorpin am Arduino (Digital-Pin 6)
int val = 0; // Variable Sensor_Pin Status
boolean KlappeGeschlossen = false; // REED-Status
int SchwellwertBatteriespannung = 10000; // Schwellwert der Batteriespannung unter 10,0V
int Batteriespannung = analogRead(A1);
int Schalterstatus = digitalRead(REED_Pin);
void setup() {
// Baudrate für GSM-Shield festlegen
mySerial.begin(19200); // GPRS Baudrate
Serial.begin(19200); // GPRS Baudrate
delay(2000);
// PINs für REED-Schalter festlegen
pinMode(Led_Pin, OUTPUT); // Led_Pin am Ausgang festlegen
pinMode(REED_Pin, INPUT); // Sensor_Pin am Eingang festlegen
// GSM shield über Digital-PIN D9 aus- und einschalten
void SIMpower();
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(5000);
}
void loop() {
//Teil 1 zur Spannungsmessung:
void Batteriespannung();
ADCSRA |= (1 << ADSC); // Messung starten
ADMUX |= (1 << REFS0); // VCC als Referenzspannung für den AD-Wandler
ADMUX |= (1 << MUX3) | (1 << MUX2) | (1 << MUX1); // 1.1V Referenzspannung als Eingang für ADC
delay(10); // warten bis sich die Referenzspannung eingestellt hat
ADCSRA |= (1 << ADEN); // ADC aktivieren
void Spannung(); {
while (bitRead(ADCSRA, ADSC)); // warten bis Messung beendet ist
// Ergebnisse des ADC zwischenspeichern. Wichtig: zuerst ADCL auslesen, dann ADCH
adc_low = ADCL;
adc_high = ADCH;
adc_result = (adc_high << 8) | adc_low; // Gesamtergebnis der ADC-Messung
vcc = 1125300L / adc_result; // Versorgungsspannung in mV berechnen (1100mV * 1023 = 1125300)
}
// if (mySerial.available())
// Serial.write(mySerial.read());
// if (Serial.available())
// mySerial.write(Serial.read());
//
//}
// Teil 3 -> Nun sollte der Code wenn entweder der REED-Schaltzustand geschlossen wird ODER die Batteriespannung unter 5,0V fällt eine SMS abgesetzt werden
//Teil 2 für den REED-Schalter, Sensorstatus abfragen
Schalterstatus = digitalRead(REED_Pin); // Sensor_Pin lesen
if (Schalterstatus == HIGH) { // Wenn es ein Öffner-Sensor ist (N.C. = normaly closed) -> HIGH : Klappe ist offen / LOW : Klappe ist geschlossen
// Wenn es ein Schließer-Sensor ist (N.0. = normally open) -> HIGH : Klappe ist geschlossen / LOW : Klappe ist offen
digitalWrite(Led_Pin, HIGH); // LED-Status-Ausgabe -> HIGH
Schalterstatus = true;
}
else {
digitalWrite(Led_Pin, LOW); // LED-Status-Ausgabe -> LOW
if ('SchwellwertBatteriespannung < Batteriespannung & KlappeGeschlossen') // Wenn die Klappe geschlossen ist ODER die Batteriespannung unter 5,0V fällt wird eine SMS versendet
Schalterstatus = false;
SMSversenden();
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------//
// Textnachricht senden
void SMSversenden() {
mySerial.print(" AT+CMGF=1\r "); // Nachricht als Text versenden; -> Textmode = AT-Befehl "CMGF=1" (siehe: GSM-spezifische AT-Kommandos)
delay(100);
mySerial.println(" AT + CMGS="+49123456789" "); // Nachricht senden -> Telefonnummer IMMER mit internationaler Vorwahl!
delay(100);
mySerial.print(" Test1234567 "); //Inhalt der Nachricht
delay(100);
mySerial.print((char)26); // der ASCII-Code von STRG+Z ist 26
delay(100);
mySerial.println();
delay(5000); // verzögerung, damit SMS versendet werden kann
//SIMpower(); // Modul ausschalten
}
Woran hängt es?
Ich finde keine logische Erklärung, wieso das SIM900 sporadisch eine SMS absetzt, ohne dass sich am Schalterzustand auf PIN 6 oder der Versorgungspannung etwas ändert.
Das SIM900 schaltet ab, sobald PIN 6 (für den Schalter) auf GND gelegt wird -> normalerweise dachte ich, dass der Schalter dann einfach als geschlossen simuliert wird.
Besten Dank,
Gruß
P.s. Die Spannungs- und Zeitangaben in den Kommentaren sind teils falsch... Einfach ignorieren