Sketch zusammenfassen (Reed-Schalter+Batteriespannung -> GSM-Shield)

tom1tom11:
mit ausgeklammerter GSM.h funktioniert die Kompilierung einwandfrei, danke!

Mit dem Serial Monitor kann ich bislang nichts anfangen, da ich leider noch keine Erfahrung/Wissen zur Anwendung dessen habe.

Das ist garnicht kompliziert und du kannst es hier nachlesen:

SerialMonitor

Für alle weiteren Dinge findest du Beispiele in der IDE und kannst diese ausprobieren.

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

tom1tom11:
Hallo ihr Profis =)

Wen meinst du damit?

Wir betreiben dies als Hobby!

Da wir nicht wissen, welches Modul du verwendest, können wir auch nur raten.

Ein Shield verwendet meist die Spannung des Arduino und da reicht der Strom oft nicht aus.
Also Link posten und prüfen ob das mit der Spannung (5Volt) aus dem Arduino, so stimmt.

Ich glaube, dieser Thread könnte dir helfen.

Beispiel

Grüße,

sorry für die zögerliche Antwort.

Ich habe dieses GSM-Board auf dem UNO:
http://www.aliexpress.com/item/SIM900-GPRS-GSM-Shield-Development-Board-Quad-Band-Module-For-Arduino-Compatible-High-Quality-Free-Shipping/32572430391.html?spm=2114.01010208.3.127.60dfhv&ws_ab_test=searchweb201556_10,searchweb201602_1_10017_10021_507_10022_10020_401_10018_10019_101,searchweb201603_9&btsid=816aa69d-1fbc-46ed-9bc0-41ed0e974d3c

Den Code habe ich nochmal komplett umgeschrieben und er würde auch m.M.n. auch fast fehlerfrei funktionieren, aber ich stelle fest, dass z.B. ein einfacher Code um eine LED über das Arduino mittels Schalter an- und auszuschalten schon zu Problemen führt. Denn irgendwie funktioniert z.B. selbst ein einfacher LED on/off-Code nur sporadisch.
Das soll heißen, dass von 10x Schalter betätigen die LED nur 8x leuchtet, deshalb bin ich etwas ratlos woran es liegt.
So brauche ich natürlich gar nicht erst anfangen den Code von mir komplett zutesten, wenn quasi bei einer einfachen LED schon scheitert.

Kann sowas am UNO selbst liegen? Das GSM-Shield oben drauf macht es noch viel schlimmer... Einmal setzt er eine SMS ab, wenn der Schalter geschlossen ist, das andere mal nicht. Natürlich wird das GSM-Shield über eine externe Spannungsquelle (Labornetzteil) mit 12V versorgt.

tom1tom11:
Das soll heißen, dass von 10x Schalter betätigen die LED nur 8x leuchtet, deshalb bin ich etwas ratlos woran es liegt.
So brauche ich natürlich gar nicht erst anfangen den Code von mir komplett zutesten, wenn quasi bei einer einfachen LED schon scheitert.

Kann sowas am UNO selbst liegen? Das GSM-Shield oben drauf macht es noch viel schlimmer... Einmal setzt er eine SMS ab, wenn der Schalter geschlossen ist, das andere mal nicht. Natürlich wird das GSM-Shield über eine externe Spannungsquelle (Labornetzteil) mit 12V versorgt.

Da du nicht beschrieben hast (Schaltbild ist hier wichtig) wie du alles verschaltet hast, können wir auch nicht weiter helfen. Wenn das schon bei einem einfachen Code nicht funktioniert, liegt sicher ein Schaltungsfehler vor.

Also bitte poste ein Schaltbild und den Sketch den du zum testen verwendest.
Auch ist wichtig, wie du das GSM-Shield mit dem Uno verbunden hast.

Foto im Anhang oder als Link in meiner GoogleDrive
https://drive.google.com/file/d/0B375BLz_llAuc2RaNmp6bUlkSTg/view

Das ist wirklich der einfachste Aufbau den man machen kann...
Kein Schalter, sondern nur "kurzgeschlossene" Pins, kein Widerstand, da die LED das locker wegsteckt.

Auszug aus dem ganzen Sketch nur für die LED:

const int Led_Pin = 12;
const int REED_Pin = 3;
int led_status = 0;

void setup()
{
pinMode(Led_Pin, OUTPUT);
pinMode(REED_Pin, INPUT);
digitalWrite(Led_Pin, LOW);

// ----------------------------------------------------- Normale Loop-Routine
void loop()
{
led_status = digitalRead(REED_Pin);

if (led_status == HIGH)
{
digitalWrite(Led_Pin, HIGH);

}
else
{
digitalWrite(Led_Pin, LOW);
}
}

tom1tom11:
Foto im Anhang.
Das ist wirklich der einfachste Aufbau den man machen kann...
Kein Schalter, sondern nur "kurzgeschlossene" Pins, kein Widerstand, da die LED das locker wegsteckt.

Auszug aus dem ganzen Sketch nur für die LED:

Noch ist kein Foto zu sehen.

Aber da bist du stark im Irrtum.

Wenn du keinen Widerstand an den Leds hast, killst du den Arduino. Der kann max. 40 mA liefern, dann wird der Ausgang gegrillt. Die Leds nehmen sich das was sie bekommen können.

Und wenn du die Eingänge ohne Pullup-Widerstände bedienst, machen die ebenso Mist und prellen dazu noch reichlich.

Du solltest dir erst mal die Datenblätter zu den Teilen durchlesen und die Grundlagen lernen. So wird das nichts.

Fazit: Einfach ist nicht immer richtig.
Bring das in Ordnung, dann wird es auch funktionieren.