Wpis z mikrobloga

Mirki pomocy.

Złożyłem sobie układ z ESP8266 (Wemos D1 mini) + moduł SIM800L. Tylko jako ze jestem zielony w programowaniu Arduino mam problem z działaniem programu.

Potrzebuje żeby ESP8266 wysłał SMS po podaniu stanu wysokiego na port 13 (D7). Wgrałem taki szkic:

#include
//piny na których jest podłączona komunikacja z modułem GSM //rx - tx (TX GSM DO 11 / RX GSM DO 12)
SoftwareSerial gsm800(4,0);

void setup() {
Serial.begin(9600);
//definiujemy PIN, gdzie podłączamy czuję ruchu - nie wszystkie złącza potrafią wybudzić urządzenie
pinMode(13, INPUT);
//definiujemy przerwanie, obsługujące alarm
attachInterrupt(digitalPinToInterrupt(13),alarm,RISING);

while(!Serial);
gsm800.begin(9600);
delay(100);
gsm800.write("AT+CMGF=1\r\n");
delay(100);
//wpisujemy numer telefonu pod który nasze urządzenie ma wysyłaś SMS
gsm800.write("AT+CMGS=\"+485006*****\"\r\n");
delay(100);
//treść wiadomości podczas startu systemu, ma na celu zweryfikowanie czy całość działa poprawnie
gsm800.write("START SYSTEMU");
delay(100);
gsm800.write((char)26);
delay(100);
}

void alarm(){
gsm800.write("AT+CMGF=1\r\n");
delay(1000);
//wpisujemy numer telefonu pod który nasze urządzenie ma wysyłać SMS
gsm800.write("AT+CMGS=\"+485006******\"\r\n");
delay(1000);
//treść wiadomości w przypadku alarmu
gsm800.write("ALARM");
delay(1000);
gsm800.write((char)26);
delay(1000);
}

void loop() {
delay(1000);
}

Ale moduł wpada w panikę bo coś z przerwaniem jest nie tak:

13:19:41.137 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
13:19:41.184 -> ⸮⸮ISR not in IRAM!
13:19:41.278 ->
13:19:41.278 -> User exception (panic/abort/assert)
13:19:41.325 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
13:19:41.419 ->
13:19:41.419 -> Abort called
13:19:41.419 ->
13:19:41.419 -> >>>stack>>>

Po zakomentowniu: "attachInterrupt(digitalPinToInterrupt(13),alarm,RISING);" moduł wysyła SMS o starcie systemu.

#arduino #esp8266 #elektronika
  • 7
@Camis: a jeszcze osobną kwestią (raczej "kultury informatycznej") byłoby nie wkładanie tak dużego (czasowo) kodu do przerwania (wysyłanie po serialu do modułu gsm będzie trwało wieki, w stosunku do wykonywania przerwania) - tylko w przerwaniu alarm() zrobienie jednej prostej rzeczy - ustawienie globalnej flagi "jest alarm" - a w pętli głównej sprawdzanie "jeśli jest flaga "jest alarm" to wykonaj to wysyłanie i skasuj tą flagę, i odczekaj np 1s" (by ci