ptrvlck icon

GSM relé

ptrvlck | PRO | 08/20/20 04:36:36 AM UTC | 0 ⭐ | 277 👁️ | Never ⏰ | []
text |

16.04 KB

|

None

|

0 👍

/

0 👎

/*
  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