/*
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);
}
}
}
Comments