Guten Abend allerseits!
ich bin momentan dran eine Alarmanlage für eine Gartenhütte zu bauen, da bei Nachbarsgrundstück vor kurzem eingebrochen wurde. Bisher hat alles funktioniert, bis auf das sich der Arduino ab und zu mal aufhängt, das heißt er macht gar nichts mehr.
Habe ein Problem schon gefunden indem ich die einzelnen Schritte an den seriellen Monitor geschickt und geschaut hab, wo er stehen bleibt. Und zwar beim RTC.. warum weiß ich nicht, evtl braucht das RTC bisschen Zeit um Informationen rauszugeben!? Daher hab ich ein Delay von 50ms eingefügt.
Zudem habe ich 75% des Arbeitsspeichers belegt, kann es auch daran liegen?
btw. Die SMS abfrage ist sehr unsauber geschrieben, aber sie funtioniert
möchte ich noch ändern
###########
Setup // Loop
###########
#include <SPI.h>
#include <MFRC522.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(9, 10);
bool alarmspeicher;
int i;
int state = 0;
char telefonnummer[] = "+4917632xxxxxxx"; //Telefonnummer für Anruf u. SMS
char tel_befehl[50];
char incoming_msg [155];
//Variablen aktuelle Zeit
unsigned int time_min;
unsigned int time_sek;
unsigned int time_hr;
//Pufferspeicher für SMS-Nachricht
char buffer_1[250];
#define RST_PIN 5 // SPI Reset Pin
#define SS_PIN 6 // SPI Slave Select Pin
MFRC522 mfrc522(SS_PIN, RST_PIN); // Instanz des MFRC522 erzeugen
unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
const long interval = 3000; // Länge der Pause in ms
byte rfid_id[10];
// rfid_safed. Dies ist der registrierte RFID-Chip
byte rfid_safed[10] = {105, 03, 61, 163};
bool speicher;
void setup() {
Serial.begin(9600); // Serielle Kommunikation mit dem PC initialisieren
SPI.begin(); // Initialisiere SPI Kommunikation
mfrc522.PCD_Init(); // Initialisiere MFRC522 Lesemodul
//Starte Verbindung zu RTC
rtc.begin();
//Starte Verbindung zu Sim800L
mySerial.begin(9600);
//LEDs
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
//Bewegungsmelder
pinMode(6,OUTPUT);
pinMode(7,INPUT);
//Türschalter
// freie Pins 0,1,3,8
}
void loop() {
Serial.println("im Loop");
// Nur wenn eine Karte gefunden wird und gelesen werden konnte, wird der Inhalt von IF ausgeführt
// PICC = proximity integrated circuit card = kontaktlose Chipkarte
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
Serial.print("Gelesene UID:");
for (byte i = 0; i < mfrc522.uid.size; i++) {
// Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], DEC);
rfid_id[i] = mfrc522.uid.uidByte[i];
}
Serial.println("");
//Überprüfung ob RFID-Chip autorisiert ist
if (speicher == LOW && rfid_id[0] == rfid_safed[0] && rfid_id[1] == rfid_safed[1] && rfid_id[2] == rfid_safed[2] && rfid_id[3] == rfid_safed[3])
{
Serial.println("Chip autorisiert");
if(speicher == LOW) alarm_ein();
return;
}
else if (speicher == LOW)
{
Serial.println("Chip nicht autorisiert");
analogWrite (3,120);
analogWrite (4,255);
delay(1000);
analogWrite (3,0);
analogWrite (4,0);
}
if (rfid_id[0] == rfid_safed[0] && rfid_id[1] == rfid_safed[1] && rfid_id[2] == rfid_safed[2] && rfid_id[3] == rfid_safed[3])
{
Serial.println("Chip autorisiert");
if(speicher == HIGH) alarm_aus();
}
else if (speicher == HIGH)
Serial.println("Chip nicht autorisiert");
analogWrite (3,120);
analogWrite (4,255);
delay(1000);
analogWrite (3,0);
analogWrite (4,0);
}
// Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
mfrc522.PICC_HaltA();
//Dies wird ausgeführt, wenn die Alarmanlage scharf gestellt ist
if (speicher == HIGH)
{
scharfstellung();
}
if (speicher == LOW) digitalWrite(4,HIGH);
delay(1000);
}
###########
zeit() RTC
###########
void zeit()
{
DateTime now = rtc.now();
delay(50);
time_min = (now.minute()); // schreibe aktuelle uhrzeit in Variable
time_sek = (now.second());
time_hr = (now.hour());
}
###########
alarm_aus / Alarm ausschalten
###########
void alarm_aus()
{
Serial.println("alarm_aus");
speicher = LOW;
Serial.println("Alarmanlage wurde ausgeschaltet");
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
//Gelesene Karte wieder auf 0 Setzen
memset(rfid_id, 0, sizeof(rfid_id)); // evtl. auch 'sizeof(rfid_id)'
//Prüfung ob gelöscht
/*int i=0;
while(i<=sizeof(rfid_id)){
Serial.print(rfid_id[i]);
Serial.print(" ");
i++;
}
i=0;
*/
delay(1000);
// Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
mfrc522.PICC_HaltA();
delay(1000);
return;
}
###########
alarm_ein() / Alarm einschalten
###########
void alarm_ein()
{
Serial.println("Alarm_ein");
//Speichervariable Alarmanlagezustand
speicher = HIGH;
Serial.println("Alarmanlage wurde scharfgestellt");
digitalWrite(4,LOW);
delay(50);
digitalWrite(3,HIGH);
delay(2000);
digitalWrite(3,LOW);
delay(1000);
//LED indikator Alarm ein
int i=0;
while(i<=5) {
digitalWrite(3,HIGH);
delay(100);
digitalWrite(3,LOW);
delay(100);
i++;
}
digitalWrite(3,HIGH);
//Gelesene ID aus RFID-Chip wieder auf 0 Setzen
memset(rfid_id, 0,sizeof(rfid_id)); // evtl. auch 'sizeof(rfid_id)'
//Prüfung ob gelöscht
/*
i=0;
while(i<=sizeof(rfid_id)){
Serial.print(rfid_id[i]);
Serial.print(" ");
i++;
}
*/
i=0;
delay(1000);
// Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
mfrc522.PICC_HaltA();
return;
}
###########
buffer_del() // SMS Pufferspeicher löschen
###########
void buffer_del()
{
//NachrichtenBuffer löschen
i=0;
while(i<=sizeof(buffer_1))
{
buffer_1[i] = 0;
i++;
}
Serial.println("SMS Buffer gelöscht");
}
###########
scharfstellung() // Alarmanlage ist eingeschaltet
###########
void scharfstellung()
{
Serial.println("in scharfstellung");
//Lässt die rote LED blinken
unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
Serial.println("Step1");
if (currentMillis - previousMillis >= interval) { // Falls mehr als 1000 ms vergangen sind
previousMillis = currentMillis; // Zeitpunkt der letzten Schaltung wird festgehalten
digitalWrite(3, !digitalRead(3)); // LED wird ein- bzw. ausgeschaltet
}
Serial.println("Step2");
if (alarmspeicher==HIGH && digitalRead(7) == LOW) //Alarmspeicher zurücksetzen, Wenn alarm nicht mehr ausgelöst
{
alarmspeicher = LOW;
Serial.println("Alarmspeicher wurde zurückgesetzt");
}
else
{
//aktuelle Zeit vom RTC abrufen
Serial.println("Step3");
zeit();
//Jede Minute SMS abrufen
Serial.println("Step4");
if (time_sek <= 1) readSMS();
Serial.println("Step5");
// Anruf starten wenn HIGH geschlossen ######Alarmauslösung
// Später noch ändern! Ausführen bei LOW-Signal (Drahtbruchsicherheit)
if(digitalRead(7)==HIGH && alarmspeicher==LOW)
{
alarmspeicher = HIGH;
Serial.print("Alarmspeicher: ");
Serial.println(alarmspeicher);
delay(1000);
Serial.println("Anruf wird gestartet");
//startcall(); //wieder aktivieren wenn Programm läuft!
//sendSMS(); //optional kann eine SMS gesendet werden
}
}
Serial.println("Step6");
}
###########
sendSMS() // SMS schicken
###########
void sendSMS()
{
Serial.println("in sendsms");
if (state = 20)
{
mySerial.println("AT"); //Handshake mit SIM-Modul
updateSerial();
mySerial.println("AT+CMGF=1"); // Textmodus konfig.
updateSerial();
mySerial.println("AT+CMGS=\"+4917632XXXXXX\"");
updateSerial();
mySerial.print("ALARM ausgeloest"); //text
updateSerial();
mySerial.write(26);
}
}
edit: rest vom code kommt in 5 minuten, da Uploadtimer 5min.
edit2: Handynr. gelöscht, Hinzufügen von Funktion