Nie wiem czy Ci tym pomogę, ale przesyłam kod alarmu, który kiedyś wymyśliłem na arduino nano i SIM800L
Są to moje wypociny pewnie z przed dwóch lat więc specjalistów proszę o wyrozumiałość. Wtedy jeszcze raczkowałem a teraz uczę się chodzić .
Może podpatrzysz i zastosujesz coś u siebie. Ja korzystałem z komend AT w komunikacji z SIM600L
Alarm miał posiadać 3 czujniki ruchu oraz kontrolował stan zasilania centrali alarmowej oraz temperatury w pomieszczeniu oraz temperaturę na kotle CO na paliwo stałe. Przy wykryciu ruchu podczas aktywnego alarmu miał wysłać SMSa i po zaniku ruchu też, ponadto przy zmianie pozostałych parametrów poza ustalone granice.
Alarm można było aktywować i dezaktywować zdalnie SNSem w każdym stanie można było "poprosić" o status
Alarm działał na płytce stykowej, ale nie doczekał się ostatecznej realizacji.
Zapewne wiele mu brakuje ale brak zapotrzebowania nie wymuszał jego rozwoju czy zmian.
Są to moje wypociny pewnie z przed dwóch lat więc specjalistów proszę o wyrozumiałość. Wtedy jeszcze raczkowałem a teraz uczę się chodzić .
Kod:
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
SoftwareSerial SMS(10, 11);
#define termometry A1 //pin do którego podłączone są termometry
#define woltomierz A2 //pin z którego czytana jest wartość napiecia akumulatora
#define napSieci A3 //pin z którego czytana jest obecność sieci 230V
String siec = "BRAK";
String nap ;
float napiecie = 0;//Napięcie akumulatora 12V (10,5V -14V) zakes od 0V do 15V
//byte siec = 0; //stan sieci ustawione wstępnie na 0 czyli brak
int tempWew; // temperatura wewnętrzna (zmienna)
int tempKotla; // temperatura kotła (zmienna)
OneWire oneWire(termometry); //Podłączenie do pinu termometry
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki
//unikalne adresy czujników 18B20
//Trzeba je odczytać programem Plik → Przykłady → OneWire → DS18x20,
DeviceAddress termometrWewnetrzny = { 0x28, 0x61, 0x64, 0x12, 0x78, 0x74, 0x38, 0xE0 };
DeviceAddress termometrKotla = { 0x28, 0x61, 0x64, 0x12, 0x7B, 0xC3, 0x92, 0xB9 };
//DeviceAddress termometrKotla = { 0x28, 0x61, 0x64, 0x12, 0x7B, 0xCB, 0x20, 0x41 };
//unsigned long aktualnyCzas = 0 ;
unsigned long zapamietanyCzas = 0 ;
char incomingByte;
String inputString;
String stanAlarmu ;
int relay = 13; // Wyjście do sterowania przekaźnikiem
String text0; //deklaracja zmiennej wysyłana smsem
//zmienne podstawiane do "text" w zależnosci od alarmu czy potwierdzenia akcji
const String text1 = "wykryto ruch pom 1\n";
const String text2 = "zanik ruchu pom 1\n";
const String text3 = "wykryto ruch pom 2\n";
const String text4 = "zanik ruchu pom 2\n";
const String text5 = "wykryto ruch pom 3\n";
const String text6 = "zanik ruchu pom 3\n";
//char* text7;
String text8 = "ALARM START";
const String text9 = "OK";
//numery na które bedą wysyłane smsy i sprawdzane czy z tych numerów przychodzą poecenia
char* numer;
char* numer1;
char* numer2;
char* numerA1;
char* numerA2;
//wskaźniki czujek ruchu zapami
byte stan;
byte stanzap1;
byte stanzap2;
byte stanzap3;
byte alarm; //blokada alarmu 0 , czuwanie alarmu 1 , ustawia to program SMSem
byte a = 5; //taki wskaźnik do pomiarów napiecia na akumulatorze
byte s = 1; //taki wskaźnik czy jest sieć
byte k = 0; // taki wskaźnik do pomiaru temperatury kotła
byte tw = 0; //taki wskaźnik do pomiaru temperatury pomieszczenia
void setup()
{
//zerowanie sim800L
pinMode (2 , OUTPUT);
digitalWrite (2, LOW);
delay (1000);
digitalWrite (2, HIGH);
delay (5000); // czs na inicjację sim80L po zerowaniu
sensors.begin(); //Inicjalizacja czujnikow temperatury
pinMode(napSieci, INPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW); // Stan wyjścia przekaźnikowego po uruchomieniu układu
SMS.begin(9600); // start UARTa programowego nazwanego SMS
Serial.begin(9600); // start UARTa serial monitora
delay(100);
pinMode(12, INPUT);
//Wstepne ustawienie wskaźników czujek ruchu
stan = 0;
stanzap1 = 0;
stanzap2 = 0;
stanzap3 = 0;
alarm = 1; //ustawienie alarmu w stan czuwania czyli aktywny
//nemery na które wysyłne będą smsy
numer1 = "AT+CMGS=\"+48xxxxxxxxx\"\r";
numer2 = "AT+CMGS=\"+48yyyyyyyyy\"\r";
//Te numery będą sprawdzane czy z nich przyszedł sms
numerA1 = "+48xxxxxxxxx";
numerA2 = "+48yyyyyyyyy";
//sprawdzenie komunikacji z sim800L
while (!SMS.available()) {
SMS.println("AT");
delay(1000);
Serial.println("Connecting...");
}
Serial.println("Connected!");//potwierdzenia że OK
SMS.println ("ATE0");//wyłączenie echa
delay (1000);
SMS.println ("ATQ1");//wyłączenie potwierdzeń
delay (1000);
SMS.println("AT+CMGF=1"); //Ustawiamy SMSy w tryb tekstowy
delay(1000);
SMS.println("AT+CNMI=1,2,0,0,0"); //Procedura, która obsługuje nadchodzące wiadomości
delay(1000);
SMS.println("AT+CMGL=\"REC UNREAD\""); // Komdenda odczytu nowych wiadomości
delay(5000);
}
// Pętla...........................
void loop()
{
czujniki (); //sprawdzenie stanu czujników i przy wykryciu zmiany wysłanie SMSa
recievemessage(); //czy przyszedł SMS
//wykonanie pomiarów i sprawdzenie stanu sieci co określony czas
if (millis () - zapamietanyCzas > 20000UL)
{
pomiary ();
//wydrukPomiarowNaSerial ();
zapamietanyCzas = millis () ;
}
}
//Podprogramy................................
void czujniki () {
text0 = "";
stan = digitalRead(12); //odczyt stanu czujnika 1
if ((stan == 1) && (stanzap1 == 0)) {
text0 = text0 + text1;
stanzap1 = 1;
}
if ((stan == 0) && (stanzap1 == 1)) {
text0 = text0 + text2;
stanzap1 = 0;
}
stan = digitalRead(12); //odczyt stanu czujnika 2
if ((stan == 1) && (stanzap2 == 0)) {
text0 = text0 + text3;
stanzap2 = 1;
}
if ((stan == 0) && (stanzap2 == 1)) {
text0 = text0 + text4;
stanzap2 = 0;
}
stan = digitalRead(12); //odczyt stanu czujnika 3
if ((stan == 1) && (stanzap3 == 0)) {
text0 = text0 + text5;
stanzap3 = 1;
}
if ((stan == 0) && (stanzap3 == 1)) {
text0 = text0 + text6;
stanzap3 = 0;
}
//tutaj zapada decyzja czy wysłać SMSa o zmianie stanu czujek ruchu
if ((alarm == 1) && (text0 != "")) {
wysPow ();
}
}
void sendmessage()
{
SMS.println(numer);
delay(1000);
SMS.println(text0);// wysyłany tekst
delay(100);
SMS.println((char)26);// ASCII code of CTRL+Z
delay(5000);
}
void recievemessage()
{
if (SMS.available()) {
delay(100);
// Serial Buffer
while (SMS.available()) {
incomingByte = SMS.read();
inputString += incomingByte;
}
delay(10);
inputString.toUpperCase(); // Zmiana wszystkich liter na wielkie w odebranej wiadomości
//Sprawdzenie czy SMS przyszedł dozwolonego numeru
//i ustawienie numeru do odesłania SMSa
byte z = 0 ;
if (inputString.indexOf(numerA1) > -1) {
numer = numer1;
z = 1;
}
if (inputString.indexOf(numerA2) > -1) {
numer = numer2;
z = 1;
}
//Gdy Z==1 czytamy dalej wiadomość i sprawdzamy co nadawca chce od systemu
if (z == 1) {
//Serial.print("z = ");
//Serial.println(z);
//Serial.println("numer OK");
if (inputString.indexOf("ON") > -1) {
digitalWrite(relay, HIGH);
}
if (inputString.indexOf("OFF") > -1) {
digitalWrite(relay, LOW);
}
//sterowanie alarmem
if (inputString.indexOf("ALARMSTART") > -1) {
alarm = 1; //załaczenie alarmu
//Serial.print ("alarm START alarm = ");
//Serial.println (alarm);
text8 = "ALARM START"; //tekst dodawany do stringa przy wysyłaniu stanu
text0 = text9;
sendmessage();
}
if (inputString.indexOf("ALARMSTOP") > -1) {
alarm = 0; //wyłączanie alarmu
//Serial.print ("alarm STOP alarm = ");
//Serial.println (alarm);
text8 = "ALARM STOP";//tekst dodawany do stringa przy wysyłaniu stanu
text0 = text9;
sendmessage();
}
//Sprawdzenie stanu systemu alarmowego
if (inputString.indexOf("STAN") > -1) {
stanAlarmu = text8 + "\nRuch " + String (stanzap1) + String (stanzap2) + String (stanzap3) + "\nSiec " + siec + "\nAkum " + String (napiecie) + " V\nAkum " + nap + "\nTemp kotla " + String (tempKotla) + "*C\nTemp pom " + String (tempWew) + "*C";
text0 = stanAlarmu;
sendmessage();
}
z = 0;
}
delay(50);
// Tutaj kasujemy wiadomości w modemie, aby oszczędzać pamięć
if (inputString.indexOf("OK") == -1) {
SMS.println("AT+CMGDA=\"DEL ALL\"");
delay(1000);
//Serial.println ("wiadomości skasowane");
}
inputString = "";
}
}
void pomiary () {
napiecie = analogRead(woltomierz) * (15.0 / 1024.0); //Przeliczenie wartości na napięcie
Serial.println(napiecie);
if ((napiecie < 12) && (napiecie >= 10.5) ) {
nap = "NAPIECIE NISKIE";
if ( a != 3 ) {
text0 = nap;
wysPow ();
a = 3 ;
}
}
if ( (napiecie < 13) && (napiecie >= 12) ) {
nap = "BRAK LADOWANIA";
if ( a != 4 ) {
text0 = nap;
wysPow () ;
a = 4 ;
}
}
if (napiecie < 10.5) {
nap = "NAPIECIE KRYTYCZNE";
if ( a != 2 ) {
text0 = nap;
wysPow () ;
a = 2 ;
}
}
if (napiecie >= 13 ) {
nap = "NAPIECIE OK";
if ( a != 5 ) {
text0 = nap;
wysPow();
a = 5 ;
}
}
sensors.requestTemperatures(); //Pobranie temperatury czujnik
tempWew = sensors.getTempC(termometrWewnetrzny);
if ((tempWew < 5) && ( tw == 0 )) {
text0 = "TEMP POM NISKA";
wysPow ();
tw = 1;
}
if ((tempWew > 6) && (tw == 1)) {
text0 = "TEMP POM OK";
wysPow ();
tw = 0;
}
//Pomiar temperatury kotła i wysłanie SMSa jak jest za wysoka
tempKotla = sensors.getTempC(termometrKotla);
if ((tempKotla > 80) && ( k == 0 )) {
text0 = "TEMP KOTLA WYSOKA";
wysPow ();
k = 1;
}
if ((tempKotla < 70) && ( k == 1)) {
text0 = "TEMP KOTLA OK";
wysPow ();
k = 0;
}
//sprawdzenie czy jest sieć i wysłanie wiadomości
if (1 == digitalRead(napSieci)) {
siec = "OK";
if ((1 == digitalRead(napSieci)) && (s == 0)) {
text0 = "Siec OK";
wysPow ();
s = 1;
}
}
if (0 == digitalRead(napSieci)) {
siec = "BRAK";
if ((0 == digitalRead(napSieci)) && (s == 1)) {
text0 = "Brak sieci";
wysPow ();
s = 0;
}
}
}
void wysPow ()
{
numer = numer1;
sendmessage();
//numer = numer2;
//sendmessage();
}
/*
void wydrukPomiarowNaSerial (){
Serial.println ("AKUMULATOR " + nap);
Serial.println ("napięcie sieci " + siec );
Serial.println("Aktualna temperatura 0 = " + String(tempWew) + " *C" );
//Serial.print(tempWew);
//Serial.println(" *C");
Serial.print("Aktualna temperatura 1 = ");
Serial.print(tempKotla);
Serial.println(" *C");
Serial.print("Napięcie ");
Serial.print(napiecie);
Serial.println(" V");
Serial.println ();
}
*/
Może podpatrzysz i zastosujesz coś u siebie. Ja korzystałem z komend AT w komunikacji z SIM600L
Alarm miał posiadać 3 czujniki ruchu oraz kontrolował stan zasilania centrali alarmowej oraz temperatury w pomieszczeniu oraz temperaturę na kotle CO na paliwo stałe. Przy wykryciu ruchu podczas aktywnego alarmu miał wysłać SMSa i po zaniku ruchu też, ponadto przy zmianie pozostałych parametrów poza ustalone granice.
Alarm można było aktywować i dezaktywować zdalnie SNSem w każdym stanie można było "poprosić" o status
Alarm działał na płytce stykowej, ale nie doczekał się ostatecznej realizacji.
Zapewne wiele mu brakuje ale brak zapotrzebowania nie wymuszał jego rozwoju czy zmian.