Toto je poslední verze celého programu. Na MEGA funguje správně.
Kód: Vybrat vše
#include <EEPROM.h> // knihovna pro zapis do pameti eeprom
#define komunikaceSIM800L Serial // serialurčuje o jaké piny se jedná - u MINI 0 a 1 , serial1 určuje o jaké piny se jedná - u mega je to 19(RX) , 18(TX)
#define LED 4
#define LED2 5
#define LED3 6 //Červená
int akce = 10;
char s;
// char odpsmsprevod[128];
String odpoved;
String odpsms;
void setup() {
// když se použije u příkazu AT+CLTS=1;&W tak je to uloženo nastálo - ale jde to jen u některých příkazů
// Serial.begin(9600);
// Serial.println("............ startuji a čekám 20 vteřin................ ");
delay(20000); // čekej 20 vteřin, aby se nastartoval modul
komunikaceSIM800L.begin(4800);
komunikaceSIM800L.println("AT+CNMI=0,0");
// uz vyuzijeme znalosti z SRAM - nevytvarime promennou
// Serial.print("velikost EEPROM je: ");
// Serial.println(EEPROM.length()); // zobrazime velikost EEPROM
// Serial.println("----------------- TEST DIOD ------------------");
digitalWrite(LED, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
delay(500);
digitalWrite(LED, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
delay(500);
digitalWrite(LED, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
delay(500);
digitalWrite(LED, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
delay(1000);
digitalWrite(LED, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
// načti hodnotu z paměti EEPROM - pamatuje si ji i po vypnutí - Jednorázově při startu
if (EEPROM.read(2) == 1)
{
digitalWrite(LED2, HIGH);
}
if (EEPROM.read(2) == 0)
{
digitalWrite(LED2, LOW);
}
//delay(3000);
}
//-----------------------------------------------------------------------------------
void loop() {
// digitalWrite(LED3, HIGH); // rozsviď Červenou, že frčíme
komunikaceSIM800L.println("AT+CMGF=1"); // nastav sms na ASCII - kdyby to vypadlo
komunikaceSIM800L.println("AT+CNMI=0,0"); // at nepíše že přišla sms
delay(100);
// vyčisti buffer
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
delay(50); // aby se stihl buffer vymazat
}
// je modul registrován?
// Serial.println("Je registrován? ");
komunikaceSIM800L.println("AT+CREG?");
delay(100);
// načti odpověď
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
odpoved = odpoved + s;
delay(100);
}
char odpovedprevod[odpoved.length() + 1];
odpoved.toCharArray(odpovedprevod, odpoved.length() + 1);
// Serial.println("PREVOD REGISTRACE ZNI:");
// Serial.println(odpovedprevod);
if (strstr(odpovedprevod, "+CREG: 0,1") != NULL)
//if (strstr.substring(18,21) == "0,1")
{
// Serial.println("===== ANO - JE REGISTROVAN =================");
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
// Serial.println(" XXXX NE - NENI REGISTROVAN XXXXX");
}
delay (2000);
odpoved = "";
//ssssssssssssssssssssssssssssssssssssssssssssssssss---------------------------------------------------------
digitalWrite(LED3, HIGH); // rozsviď Červenou, že frčíme
// Serial.println("===== čistím buffer =================");
// vyčisti buffer
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
delay(50); // aby se stihl buffer vymazat
}
delay(100);
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
delay(50); // aby se stihl buffer vymazat
}
delay(100);
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
delay(100); // aby se stihl buffer vymazat
}
// přečti SMS
komunikaceSIM800L.println("AT+CMGR=1");
delay(100);
// načti odpověď
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
odpsms = odpsms + s;
delay(50);
}
delay(100);
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
odpsms = odpsms + s;
delay(50);
}
char odpsmsprevod[odpsms.length() + 1];
odpsms.toCharArray(odpsmsprevod, odpsms.length() + 1);
// Serial.println("PREVOD SMS ZNI:");
// Serial.println(odpsmsprevod);
// Serial.println("AKCE MA CISLO:");
// Serial.println(akce);
if ((strstr(odpsmsprevod, "+420xxxxxxxxxx") != NULL) && (strstr(odpsmsprevod, "ZAPNI") != NULL)) {
// Serial.println("ssssssss - splněna podmínka 737 a ZAPNI");
digitalWrite(LED2, HIGH);
delay(1000);
akce = 1;
}
if (strstr(odpsmsprevod, "+420xxxxxxxxxx") != NULL && strstr(odpsmsprevod, "VYPNI") != NULL) {
// Serial.println("ssssssss - splněna podmínka 737 a VYPNI");
akce = 2;
}
if (strstr(odpsmsprevod, "+420xxxxxxxxxx") != NULL && strstr(odpsmsprevod, "STAVMODULU") != NULL) {
// Serial.println("ssssssss - splněna podmínka 737 a STAVMODULU");
akce = 3;
}
// Serial.println("úkol přidělen");
if (strstr(odpsmsprevod, "+CMGR:") != NULL)
{ // Serial.println("byla načtena nějaká SMS, takže je vyhodnocena a tak ji mažu");
komunikaceSIM800L.println("AT+CMGD=1");
delay(500);
// zablikej že smaže SMS
digitalWrite(LED3, HIGH);
delay(500);
digitalWrite(LED3, LOW);
delay(500);
digitalWrite(LED3, HIGH);
delay(500);
digitalWrite(LED3, LOW);
delay(500);
digitalWrite(LED3, HIGH);
delay(500);
digitalWrite(LED3, LOW);
delay(500);
digitalWrite(LED3, HIGH);
delay(500);
digitalWrite(LED3, LOW);
delay(500);
digitalWrite(LED3, HIGH);
}
else
{// Serial.println("SMS NESMAZANA");
// zablikej Bílou že NEMAŽE SMS
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
digitalWrite(LED, HIGH);
}
// úkol přidělen nebo chybný příkaz nebo odesílatel - SMAŽ SMS ======
// Serial.println("A po podmínkách má AKCE CISLO:");
// Serial.println(akce);
switch (akce) {
case 1:
// Serial.println("VYKONAVAM podminka 1");
// zapiš do EEPROM 1
EEPROM.update(2, 1);
// Serial.println("===== ZAPNUTO =================");
// prozvon
// Serial.println("Volam si");
komunikaceSIM800L.println("ATD00420xxxxxxxx;");
delay (7000);
// Serial.println("zaves hovor");
komunikaceSIM800L.println("ATH");
break;
case 2:
// Serial.println("VYKONAVAM podminka 2");
//zapiš do EEPROM 0
EEPROM.update(2, 0);
// Serial.println("===== VYPNUTO =================");
// prozvon
// Serial.println("Volam si...");
komunikaceSIM800L.println("ATD00420xxxxxxxxxx;");
delay (7000);
// Serial.println("zavěs ");
komunikaceSIM800L.println("ATH");
delay (1000);
break;
case 3:
// Serial.println("VYKONAVAM podminka 3");
// pokud SMS obsahuje STAV pošli SMS
if (EEPROM.read(2) == 1)
{
// Serial.println("VYKONAVAM podminka 3 - EEPROM = 1");
delay(500);
// pošli sms zapnuto
komunikaceSIM800L.println("AT+CMGS=\"00420xxxxxxxxx\"");
delay (500);
komunikaceSIM800L.println("Testovaci modul - ZAPNUTO");
delay (500);
// Zakonceni zpravy
komunikaceSIM800L.write(char(26));
delay (1000);
}
if (EEPROM.read(2) == 0)
{
// Serial.println("VYKONAVAM podminka 3 - EEPROM = 0");
delay(500);
// pošli sms vypnuto
komunikaceSIM800L.println("AT+CMGS=\"00420xxxxxxxxx\"");
delay (500);
komunikaceSIM800L.println("Testovaci modul - VYPNUTO");
delay (500);
// Zakonceni zpravy
komunikaceSIM800L.write(char(26));
delay (1000);
}
break;
}
// Serial.println("JE PO CASE UZ NIC NEVYKONAVAM");
akce = 10;
odpsms = "";
// sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
// načti hodnotu z paměti EEPROM - pamatuje si ji i po vypnutí
// Serial.println("===== načti hodnotu z EPROM =================");
if (EEPROM.read(2) == 1)
{
// Serial.println("===== EPROM JE 1 - zapni LED 2=================");
digitalWrite(LED2, HIGH);
}
if (EEPROM.read(2) == 0)
{
// Serial.println("===== EPROM JE 0 - vypni LED 2=================");
digitalWrite(LED2, LOW);
}
digitalWrite(LED3, LOW); // zhasni před čekačkou
digitalWrite(LED, LOW);
// Serial.println("===== ČEKám 20 vteřin =================");
delay(20000);
}