/* Ovládaní reléové desky na pinech xx - xx pro dálkové ovládání pulzy pomocí LILYGO TTGO T-Call s GSM modulem SIM800L. Ovládání probíhá zasláním SMS z autorizovaného čísla ve správném formátu. Červená LED bliká rychle - připojuje se k GSM Červená LED bliká pomalu - připojeno k GSM Modrá led bliká - symčka loop běží, čeká na SMS Modrá LED svítí - zpracování požadavku Modrá LED lze připojit přes GPIO13 na externí LED TEXT zprávy: "RELE1" - "RELE8" Přidávání autorizovaných čísel v seznamu globálních proměnných níže. Program přizpůsoben z modelového příkladu knihovny Adafruit_FONA.h. Úpravy a přizpůsobení - Ševčík Vlastislav GSM modul LILYGO TTGO T-Call v1.3 Aliexpress https://www.aliexpress.com/item/4000334093712.html Relé modul 6 - kanál, 5V Aliexpress https://www.aliexpress.com/item/4001233245723.html */ // Připojení knihovny FONA #include "Adafruit_FONA.h" // Definice aliasů - piny relé #define RELE1 32 #define RELE2 33 #define RELE3 25 #define RELE4 21 #define RELE5 19 #define RELE6 18 #define RELE7 22 #define RELE8 23 // Definice aliasů - ostatní #define LED_STATUS 13 #define SIM800L_RX 27 #define SIM800L_TX 26 #define SIM800L_PWRKEY 4 #define SIM800L_RST 5 #define SIM800L_POWER 23 // Globální proměnné // // seznam povolených čísel char pov_cislo0[32]; String pov_cislo; String pov_cislo1 = "+420603123456"; String pov_cislo2 = "+420000000000"; String pov_cislo3 = "+420000000000"; String pov_cislo4 = "+420000000000"; String pov_cislo5 = "+420000000000"; String pov_cislo6 = "+420000000000"; String pov_cislo7 = "+420000000000"; String pov_cislo8 = "+420000000000"; String pov_cislo9 = "+420000000000"; String pov_cislo10 = "+420000000000"; // seznam SMS příkazů pro relé 1 - 8 String ovl_rele1 = "1"; String ovl_rele2 = "2"; String ovl_rele3 = "3"; String ovl_rele4 = "4"; String ovl_rele5 = "5"; String ovl_rele6 = "6"; // Mastavení funkce relé: // do hodnoty "fce_rele" zadat 0 pro trigger nebo 1 pro puls. // trigger = jedna SMS zapne, druhá SMS vypne // puls = SMS spustí puls v definované délce // delka_pulsu = délka pulsu v režimu "puls" // Do proměnné SMS_odp_rele zadat: 0 = bez zpětné vazby, 1 = zpěná SMS o provedení příkazu // // RELÉ 1 int fce_rele1 = 1; int delka_pulsu1 = 100; int SMS_odp_rele1 = 0; // RELÉ 2 int fce_rele2 = 1; int delka_pulsu2 = 500; int SMS_odp_rele2 = 0; // RELÉ 3 int fce_rele3 = 1; int delka_pulsu3 = 1000; int SMS_odp_rele3 = 0; // RELÉ 4 int fce_rele4 = 1; int delka_pulsu4 = 2000; int SMS_odp_rele4 = 0; // RELÉ 5 int fce_rele5 = 1; int delka_pulsu5 = 5000; int SMS_odp_rele5 = 0; // RELÉ 6 int fce_rele6 = 1; int delka_pulsu6 = 10000; int SMS_odp_rele6 = 0; // Globální proměnné - další char replybuffer[255]; String smsString = ""; long prevMillis = 0; // proměnná pro blikač int interval = 2700; // proměnná pro blikač boolean ledState = false; boolean stav_rele1 = true; boolean stav_rele2 = true; boolean stav_rele3 = true; boolean stav_rele4 = true; boolean stav_rele5 = true; boolean stav_rele6 = true; // Start HW seriové linky HardwareSerial *sim800lSerial = &Serial1; Adafruit_FONA sim800l = Adafruit_FONA(SIM800L_PWRKEY); uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0); // Startovací sekvence void setup() { // Definice vstupu / vystupu pinMode(LED_STATUS, OUTPUT); pinMode(RELE1, OUTPUT); pinMode(RELE2, OUTPUT); pinMode(RELE3, OUTPUT); pinMode(RELE4, OUTPUT); pinMode(RELE5, OUTPUT); pinMode(RELE6, OUTPUT); pinMode(SIM800L_POWER, OUTPUT); // Nastaveni inicializačních stavů digitalWrite(LED_STATUS, LOW); digitalWrite(RELE1, HIGH); digitalWrite(RELE2, HIGH); digitalWrite(RELE3, HIGH); digitalWrite(RELE4, HIGH); digitalWrite(RELE5, HIGH); digitalWrite(RELE6, HIGH); digitalWrite(SIM800L_POWER, HIGH); // Spuštění seriové linky Serial.begin(115200); Serial.println(F("Inicializace GSM modulu. 10 sekund...")); // Nutná pauza pro inicializaci GSM for (int i = 10; i > 0; i--) { Serial.println (i); delay(1000); } // Make it slow so its easy to read! sim800lSerial->begin(4800, SERIAL_8N1, SIM800L_TX, SIM800L_RX); if (!sim800l.begin(*sim800lSerial)) { Serial.println(F("GSM SIM800L nenalezen")); while (1); } Serial.println(F("GSM SIM800L je OK")); char imei[16] = {0}; // NUTNO použít 16 místný buffer pro IMEI! uint8_t imeiLen = sim800l.getIMEI(imei); if (imeiLen > 0) { Serial.print("IMEI: "); Serial.println(imei); } // Nastavení FONA knihovny pro odeslání +CMTI notifikace v případě příchozí SMS sim800lSerial->print("AT+CNMI=2,1\r\n"); // Nastavení a kontrola textového formátu SMS sim800lSerial->print("AT+CMGF?\r\n"); sim800lSerial->print("AT+CMGF=1\r\n"); sim800lSerial->print("AT+CMGF?\r\n"); // Zjištění síly signálu sim800lSerial->print("AT+CSQ\r\n"); // mazání SMS na kartě (20 pozic) for (int i = 0; i < 20; i++) { sim800l.deleteSMS(i); } // Konec startovací sekvence Serial.println("GSM SIM800L Ready"); Serial.println(String("Start zabral ") + (millis() / 1000) + String("s.")); } // Buffery pro notifikace z knihovny FONA char sim800lNotificationBuffer[64]; char smsBuffer[250]; void loop() { // Stavová LED if (millis() - prevMillis > interval) { digitalWrite(LED_STATUS, HIGH); delay(100); digitalWrite(LED_STATUS, LOW); prevMillis = millis(); } char* bufPtr = sim800lNotificationBuffer; //handy buffer pointer delay(100); if (sim800l.available()) { int slot = 1; // this will be the slot number of the SMS int charCount = 0; // Read the notification into fonaInBuffer do { *bufPtr = sim800l.read(); Serial.write(*bufPtr); delay(1); } while ((*bufPtr++ != '\n') && (sim800l.available()) && (++charCount < (sizeof(sim800lNotificationBuffer) - 1))); //Add a terminal NULL to the notification string *bufPtr = 0; //Zjišťování, zda se objeví notifikace o SMS. // Pokud se objeví zpráva, dostaneme číslo slotu, kde je uložena zpráva - 'slot' if (1 == sscanf(sim800lNotificationBuffer, "+CMTI: \"SM\",%d", &slot)) { digitalWrite(LED_STATUS, HIGH); Serial.print("slot: "); Serial.println(slot); char callerIDbuffer[32]; //uložení čísla odesílatele // Získání telefonního čísla. if (!sim800l.getSMSSender(slot, callerIDbuffer, 31)) { Serial.println("Nenalezena zpráva ve slotu!"); } Serial.print(F("Od: ")); Serial.println(callerIDbuffer); sim800l.getSMSSender(slot, pov_cislo0, 31); pov_cislo = String(pov_cislo0); // Retrieve SMS value. uint16_t smslen; // Pass in buffer and max len! if (sim800l.readSMS(slot, smsBuffer, 250, &smslen)) { smsString = String(smsBuffer); Serial.println(smsString); } // Kontrola, zda přijatá SMS je z povoleného čísla if (pov_cislo == pov_cislo1 || pov_cislo == pov_cislo2 || pov_cislo == pov_cislo3 || pov_cislo == pov_cislo4 || pov_cislo == pov_cislo5 || pov_cislo == pov_cislo6 || pov_cislo == pov_cislo7 || pov_cislo == pov_cislo8 || pov_cislo == pov_cislo9 || pov_cislo == pov_cislo10) { Serial.println("Povolene cislo"); // RELE 1 if (smsString == ovl_rele1) { Serial.println("Prikaz " + ovl_rele1 + " pro rele c.1"); // FUNKCE TRIGGER if (fce_rele1 == 0) { stav_rele1 = !stav_rele1; digitalWrite(RELE1, stav_rele1); if (SMS_odp_rele1 == 1) { Serial.println("Poslat SMS"); if (stav_rele1 == true) { Serial.print("SMS - Rele sepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE1 sepnuto."); } else if (stav_rele1 == false) { Serial.print("SMS - Rele rozepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE1 rozepnuto."); } } else if (SMS_odp_rele1 == 0) { Serial.println("Neposilat SMS"); } int puls1; } // FUNKCE PULS else if (fce_rele1 == 1 ) { digitalWrite(RELE1, LOW); delay(delka_pulsu1); digitalWrite(RELE1, HIGH); if (SMS_odp_rele1 == 1) { Serial.println("Poslat SMS"); sim800l.sendSMS(callerIDbuffer, "RELE1 provedlo puls."); } else if (SMS_odp_rele1 == 0) { Serial.println("Neposilat SMS"); } } } // RELE 2 else if (smsString == ovl_rele2) { Serial.println("Prikaz " + ovl_rele2 + " pro rele c.2"); // FUNKCE TRIGGER if (fce_rele2 == 0) { stav_rele2 = !stav_rele2; digitalWrite(RELE2, stav_rele2); if (SMS_odp_rele2 == 1) { Serial.println("Poslat SMS"); if (stav_rele2 == true) { Serial.print("SMS - Rele sepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE2 sepnuto."); } else if (stav_rele2 == false) { Serial.print("SMS - Rele rozepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE2 rozepnuto."); } } else if (SMS_odp_rele2 == 0) { Serial.println("Neposilat SMS"); } int puls2; } // FUNKCE PULS else if (fce_rele2 == 1 ) { digitalWrite(RELE2, LOW); delay(delka_pulsu2); digitalWrite(RELE2, HIGH); if (SMS_odp_rele2 == 1) { Serial.println("Poslat SMS"); sim800l.sendSMS(callerIDbuffer, "RELE2 provedlo puls."); } else if (SMS_odp_rele2 == 0) { Serial.println("Neposilat SMS"); } } } // RELE 3 else if (smsString == ovl_rele3) { Serial.println("Prikaz " + ovl_rele3 + " pro rele c.3"); // FUNKCE TRIGGER if (fce_rele3 == 0) { stav_rele3 = !stav_rele3; digitalWrite(RELE3, stav_rele3); if (SMS_odp_rele3 == 1) { Serial.println("Poslat SMS"); if (stav_rele3 == true) { Serial.print("SMS - Rele sepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE3 sepnuto."); } else if (stav_rele3 == false) { Serial.print("SMS - Rele rozepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE3 rozepnuto."); } } else if (SMS_odp_rele3 == 0) { Serial.println("Neposilat SMS"); } int puls3; } // FUNKCE PULS else if (fce_rele3 == 1 ) { digitalWrite(RELE3, LOW); delay(delka_pulsu3); digitalWrite(RELE3, HIGH); if (SMS_odp_rele3 == 1) { Serial.println("Poslat SMS"); sim800l.sendSMS(callerIDbuffer, "RELE3 provedlo puls."); } else if (SMS_odp_rele3 == 0) { Serial.println("Neposilat SMS"); } } } // RELE 4 else if (smsString == ovl_rele4) { Serial.println("Prikaz " + ovl_rele4 + " pro rele c.4"); // FUNKCE TRIGGER if (fce_rele4 == 0) { stav_rele4 = !stav_rele4; digitalWrite(RELE4, stav_rele4); if (SMS_odp_rele4 == 1) { Serial.println("Poslat SMS"); if (stav_rele4 == true) { Serial.print("SMS - Rele sepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE4 sepnuto."); } else if (stav_rele4 == false) { Serial.print("SMS - Rele rozepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE4 rozepnuto."); } } else if (SMS_odp_rele4 == 0) { Serial.println("Neposilat SMS"); } int puls4; } // FUNKCE PULS else if (fce_rele4 == 1 ) { digitalWrite(RELE4, LOW); delay(delka_pulsu4); digitalWrite(RELE4, HIGH); if (SMS_odp_rele4 == 1) { Serial.println("Poslat SMS"); sim800l.sendSMS(callerIDbuffer, "RELE4 provedlo puls."); } else if (SMS_odp_rele4 == 0) { Serial.println("Neposilat SMS"); } } } // RELE 5 else if (smsString == ovl_rele5) { Serial.println("Prikaz " + ovl_rele5 + " pro rele c.5"); // FUNKCE TRIGGER if (fce_rele5 == 0) { stav_rele5 = !stav_rele5; digitalWrite(RELE5, stav_rele5); if (SMS_odp_rele5 == 1) { Serial.println("Poslat SMS"); if (stav_rele5 == true) { Serial.print("SMS - Rele sepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE5 sepnuto."); } else if (stav_rele5 == false) { Serial.print("SMS - Rele rozepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE5 rozepnuto."); } } else if (SMS_odp_rele5 == 0) { Serial.println("Neposilat SMS"); } int puls5; } // FUNKCE PULS else if (fce_rele5 == 1 ) { digitalWrite(RELE5, LOW); delay(delka_pulsu5); digitalWrite(RELE5, HIGH); if (SMS_odp_rele5 == 1) { Serial.println("Poslat SMS"); sim800l.sendSMS(callerIDbuffer, "RELE5 provedlo puls."); } else if (SMS_odp_rele5 == 0) { Serial.println("Neposilat SMS"); } } } // RELE 6 else if (smsString == ovl_rele6) { Serial.println("Prikaz " + ovl_rele6 + " pro rele c.6"); // FUNKCE TRIGGER if (fce_rele6 == 0) { stav_rele6 = !stav_rele6; digitalWrite(RELE6, stav_rele6); if (SMS_odp_rele6 == 1) { Serial.println("Poslat SMS"); if (stav_rele6 == true) { Serial.print("SMS - Rele sepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE6 sepnuto."); } else if (stav_rele6 == false) { Serial.print("SMS - Rele rozepnuto"); sim800l.sendSMS(callerIDbuffer, "RELE6 rozepnuto."); } } else if (SMS_odp_rele6 == 0) { Serial.println("Neposilat SMS"); } int puls6; } // FUNKCE PULS else if (fce_rele6 == 1 ) { digitalWrite(RELE6, LOW); delay(delka_pulsu6); digitalWrite(RELE6, HIGH); if (SMS_odp_rele6 == 1) { Serial.println("Poslat SMS"); sim800l.sendSMS(callerIDbuffer, "RELE6 provedlo puls."); } else if (SMS_odp_rele6 == 0) { Serial.println("Neposilat SMS"); } } } } // Pokud není číslo v seznamu, vymaže SMS z paměti a čeká na další. else { Serial.println("Zakazane cislo"); } while (1) { if (sim800l.deleteSMS(slot)) { Serial.println(F("Vymazani OK!")); break; } else { Serial.print(F("Nelze vymazat SMS ve slotu ")); Serial.println(slot); sim800l.print(F("AT+CMGD=?\r\n")); } } digitalWrite(LED_STATUS, LOW); } } }