Hallo.
Ich benötige bitte eure Hilfe. Ich bin leider kein Programmierer und möchte aber gerne folgendes realisieren.
Es geht ganz einfach darum, dass ich gerne einen Fallenmelder realisieren möchte.
Über einen Reed Kontakt (Schließer) möchte ich ganz einfach per SMS eine Meldung erhalten, sobald die Falle geschlossen bzw. zu ist.
Folgende Komponenten habe ich im Einsatz:
Arduino Nano Mikrocontroller Atmel ATmega328 (versorgt über 4xAA Batterien und über RX TX mit SIM 800L verbunden)
Mini GPRS GSM SIM800L 3.7-4.2V (über DC-DC Wandler von 4xAA Batterien versorgt)
Reed Kontakt von +5V des Arduino versorgt und mit DI6 als Eingang verbunden (ggf Widerstand verwenden,…das habe ich schon wo gelesen)
Ich habe die Schaltung bereits fertig aufgebaut. Der Reed Kontakt ist ein Schließer (bei Betätigung mit Magnet=Falle offen). Sobald die Falle geschlossen ist, entfernt sich der Magnet und der Reed Kontakt ist quasi offen. Das wäre der digitale Eingang.
Ich habe im Internet bereits ein fertige programmiertes Programm gefunden, das aber leider nicht wirklich funktioniert?!. Ich kann es zwar fehlerfrei auf den Arduino übertragen aber auf dem Arduino leuchtet nach dem Übertragen immer nur die grüne Power LED. Wenn ich ein Testprogramm aus den Examples übertrage leuchten nach dem Übertragen dann auch andere LEDs…?!.
Wenn ich dann den Reed Kontakt teste bzw. schalte tut sich gar nichts. Auch im Serial Monitor sehe ich keine Zustände. Es ist einfach keine Funktion vorhanden.
Daher meine große Bitte ob sich mal jemand das Programm ansehen kann und mir behilflich sein kann, dies richtig zu stellen, sodass dieses funktioniert?
Das Programm habe ich als Anlage beigehängt (zum Download)
Und der Herr sprach: Nimm CODE-Tags, dann sieht 'das Volk' auch was vom Code.
Ich nahm CODE-Tags ... und ... das Volk sah ...
//References
//http://tronixstuff.com/2014/01/08/tutorial-arduino-and-sim900-gsm-modules/
// This sketch is used for SIM800L EVB
// Connect VIO to +5V
// Connect GND to Ground
// Connect RX (data into SIM800L) to Digital 11
// Connect TX (data out from SIM800L) to Digital 10
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
int flag =1; //alarm status 1 = active, 0 = Inactive
int counter; //for character reading (string length)
int count; //is being used in compareNum()
int countsec; //is being used in compareNum()
int check; //should be 10 chars in order to send or not sms
int switchState=0;
//unsigned long hourInterval = 3600000; // One hour Interval
const int magnetSwitch = 6; //Pin Read
const int led = 9; //Led Pin
unsigned long hourInterval = 43000000; // five minutes
unsigned long previousMillis = 0; // will store last time
String inData; //Will hold the incoming character from the GSM shield
char mynumber[]="6940000000";
char secnumber[]="6940000000";
void setup()
{
pinMode(magnetSwitch, INPUT);
pinMode(led, OUTPUT);
Serial.begin(19200);
mySerial.print("\r");
mySerial.begin(19200);
delay (1000);
//new start
mySerial.print("AT+CLIP=1\r"); // turn on caller ID notification
delay(1000);
mySerial.print("AT+CNMI=2,2,0,0,0\r"); //old good working
delay(1000);
}
void loop() // run over and over
{delay(30000);
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= hourInterval) {
previousMillis = currentMillis;
flag=1;
}
while (mySerial.available() > 0)
{
delay(10); //new
char recieved = mySerial.read(); //old good
inData += recieved; //old good
// Process message when new line character is recieved
if (recieved == '\n')
{
Serial.print("Arduino Received: ");
Serial.print(inData);
//mySerial.print("Arduino Received: ");
//mySerial.print(inData);
counter=0; //counter reset
for (int i=0; i <30; i++)
{
if (inData[i]!='\0') //Calculates each string comes from mySerial to inData string
counter++; //is being used in for loop to calculate the array's length
}
Serial.print("Counter = ");
Serial.println(counter);
//TEST
//Serial.print("character="); //traces
//Serial.println(inData[10]); //traces for incomming sms. character 10 is the first number of the cellphone
//TEST
check=0;
if (counter > 10)
check = compareNum();
if (inData[0]=='s') //When receive sms with letter s it prints the current status
{
Serial.print ("Status =");
Serial.println(flag); //1=ACTIVE, 2= INACTIVE
if (flag==1)
{
sendAlarmStatus("Alarm Active");
mySerial.write(0x1A); //Equivalent to sending Ctrl+Z
}
else
{
sendAlarmStatus("Alarm Inactive");
mySerial.write(0x1A); //Equivalent to sending Ctrl+Z
}
}
inData = ""; // Clear received buffer
}//if bracket
}//while loop bracket
//20160303 new block end
if ((check == 10) && (flag==1)) //check receives the result of the comparison (cellphone number comparison)
{
sendAlarmStatus("Alarm Deactivated");
flag=0; //Alarm Deactivated
mySerial.println("AT"); //NEW TEST
delay(200);
}
// if ((check == 10) && (flag==0))
// {
// sendAlarmStatus("Alarm Activated");
// flag=1; //Alarm Activated
// delay(200);
// }
//Serial block reads Serial input
if (Serial.available()){
char c = (char)Serial.read(); //Read characters/commands in the serial monitor input
if(c == '#')
mySerial.write((char)26);
else
mySerial.write(c); //will send the commands to mySerial, to Sim800L
}
//20160303 start
if(flag==1)
{
switchState = !digitalRead(magnetSwitch); //When switch is closed it reads High(1), but it registers LOW(0) - the opposite -
if (switchState == HIGH)
{
digitalWrite(led, HIGH);
sendAlarmStatus("Falle zu!");
flag = 0;
}
else
{
digitalWrite(led, LOW);
}
}
else
digitalWrite(led, LOW);
//20160303 stop
}//loop end bracket
void sendAlarmStatus(char *alm)
{
mySerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
if (count==10)
{
mySerial.println("AT+CMGS=\"+436764440232\""); // recipient's mobile number, in international format
delay(200);
}
else if (countsec==10)
{
mySerial.println("AT+CMGS=\"+436764440232\""); // recipient's mobile number, in international format
delay(200);
}
else
{
mySerial.println("AT+CMGS=\"+436764440232\""); // recipient's mobile number, in international format
delay(200);
}
mySerial.println(alm); // message to send
delay(200);
mySerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
mySerial.println("");
delay(5000);
}
void call()
{
mySerial.println("ATD+436764440232*;");
}
void hang_up()
{
mySerial.println("ATH");
}
void del_sms_all()
{
mySerial.println("AT+CMGD=1,4"); // delete all SMS
}
int compareNum(){
int z=0; //index
count=0;
countsec=0;
for (int j=11;j<21;j++)
{
if (mynumber[z]==inData[j]) //cell. number would be compared with the caller's number char by char
{
z++;
count++; //If count==10 then diactivates alarm
}
}
z=0;
for (int j=11;j<21;j++)
{
if (secnumber[z]==inData[j]) //cell. number would be compared with the caller's number char by char
{
z++;
countsec++; //If countsec==10 then diactivates alarm
}
}
Serial.print("Characters matching = ");
Serial.print(countsec);
Serial.print("----------");
Serial.println(count); //If check equals to ten, Then the caller is me and will do action
if (count==10)
return(count);
else
return (countsec);
}
//Steps to send sms
/*{
mySerial.print("AT+CMGF=1\r"); //Because we want to send the SMS in text mode
delay(1000);
mySerial.print("AT+CMGS=\"");
mySerial.print(snFull);
mySerial.print("\"\r");
delay(1000);
mySerial.print("Unknown Command: ");
mySerial.print(sms);
mySerial.print("\r");
delay(1000);
mySerial.write(0x1A); //Equivalent to sending Ctrl+Z
return;
}*/
MfG
PS: Zum 'Spielen' solltest Du Serial.print("Hallali"); (oder so was) im Sketch verteilen, damit Du SIEHST, wo sich Dein Sketch rumtreibt.
Auch würde ich das delay(30000); am Anfang von loop() - zumindest zum Testen, arg viel kleiner wählen.
SO hast Du nur alle 30 Sekunden die Chance, mit Deinem Fallenmelder 'zu schwätzen' und ggf. eine Reaktion hervor zu rufen.
Bernhard1982:
Hallo und Danke für die rasche Antwort.
Das heißt ich soll eien Widerstand (100kOhm??) zwischen Pin6 und ground einlöten?
Ja, du brauchst in deinem Fall einen Pulldown-Widerstand, damit der Eingang einen definierten Wert hat.
Ohne den arbeitet dein Eingang als Empfänger und hat irgendwas undefiniertes.
Den Wert solltest du nicht zu hochohmig wählen, damit dieser auch wirksam ist.
postmaster-inof. Danke dir für die rasche Antwort! Danke.
Das heißt, bis auf das delay mit 30000 ist das programm soweit funktionsfähig deiner Meinung nach?
Welche LED Statusanzeigen sollten am Arduino im Normalbetrieb leuchten?
Bei mir leuchtet ja nur die grüne PWR LED.
Bernhard1982:
Welche LED Statusanzeigen sollten am Arduino im Normalbetrieb leuchten?
Bei mir leuchtet ja nur die grüne PWR LED.
Das hängt auch vom Programm ab, welche Led da aktiviert wird.
Beim Flashen z.B. blinken Led RX und TX. Wenn die Led an Pin D13 aktiviert ist, leuchtet auch die Led "L".
ich würde eher den Eingangs-PIN für den REED-Kontakt mit Pullup (also nach +) initialisieren und dann den REED-Kontakt nach Masse legen. Sparst dir einen Widerstand.
Und dann würde ich die ganze Sache etwas aufteilen: Erst mal die Schleife mit dem REED-Kontakt abfragen testen und wenn das läuft das SMS senden reinmachen. Und dazu vielleicht erst mal das SIM800 Modul in einem eigenen Sketch dazu bringen, eine SMS zu senden und einen Anruf zu machen. Und wenn ich das richtig sehe schickst du Befehle an das SIM800 ohne zu prüfen ob die auch richtig abgearbeitet werden. Und evtl. solltest am Anfang auch prüfen ob das SIM überhaupt eingebucht ist. So einfach Kommandos wegschicken ist kritisch....
Du meinst betreffend des Widerstandes gem. Abbildung im Anhang?
Betreffend des Programms dafür. kannst du mir dabei behilflich sein, dieses Programm
zu schreiben, sodass es auch funktioniert?
Gegen eine kleine finanzielle Entschädigung eventuell?