Arduino IDE + NodeMCU v1.0 + Interrupt

C,C++,C#

Moderátori: psichac, Moderátori

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa bebeno28 » 14 Jún 2017, 13:38

Ahojte páni/dámy.

Chcel by som Vás poprosiť o radu.

Pracujem na jednom mojom projekte kde z Externych zdrojov prijimam json data a zobrazujem si ich na LCD. Vsetko mi funguje ale potrebujem do projektu pridat prepinanie stran co sa ma zobrazovat a chcem to sporavit pomocou tlacitka a prerusenia .

Toto je moj problem . Neviem co robim zle ale precital som si už kopec stránok a príkladov na interrupt pre ESP a ani jeden mi nefunguje.

Idem od zakladu a snažím sa zapnut led a zaroven vypisat na Serial monitor ON a OFF ale po stlacení tlačítka mi to vodec do prerusenia neskoci a ja neviemprist na to prečo.

Kód: Vybrať všetko

#include <ESP8266WiFi.h>

const byte led = LED_BUILTIN;
const byte but = D2;
volatile byte state = LOW;

void setup() {
  Serial.begin(115200);
  delay(100);

  Serial.println();
  Serial.println("Serial OK");
  pinMode(led, OUTPUT);
  pinMode(but, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(but), prerus, LOW);
}

void loop() {

}

void prerus() {

  digitalWrite(led, HIGH);
  Serial.println("ON");
  delay(500);

  digitalWrite(led, LOW);
  Serial.println("OFF");
  delay(500);
}
Po staceni tlacitka by malo zapnut LED napisat ON a serial monitor a Vypnut led a napisat OFF.

Napada vas preco mi to nejde?

Ďakujem
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa maskrtnik01 » 14 Jún 2017, 14:27

Dobrý deň,

https://www.arduino.cc/en/Reference/Interrupts

Skúste, či nemáte náhodou vypnuté prerušenia - aj keď podľa uvedenej stránky by nemali byť vypnuté.
0

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa bebeno28 » 14 Jún 2017, 14:46

Dakujem za reakciu.Skusil som ale nepomohlo. Uplne to je hluche. Je daky sposob ako zistit co to vlastne robi ked stalcim tlacitko?
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa maskrtnik01 » 14 Jún 2017, 14:50

https://www.arduino.cc/en/Reference/AttachInterrupt

Ešte sa pohrajte s nastavením režimu. Na tlačítko proti zemi by som odporúčal FALLING.

EDIT: Len pre istotu sa spýtam. Tlačítko máte dúfam pripojené na správny pin a proti zemi.
0

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa bebeno28 » 14 Jún 2017, 15:05

Ano Pin som si niekolko krat prekontroloval a vychadzam z tohoto zoznamu.
  • static const uint8_t D0 = 16;
    static const uint8_t D1 = 5;
    static const uint8_t D2 = 4;
    static const uint8_t D3 = 0;
    static const uint8_t D4 = 2;
    static const uint8_t D5 = 14;
    static const uint8_t D6 = 12;
    static const uint8_t D7 = 13;
    static const uint8_t D8 = 15;
    static const uint8_t D9 = 3;
    static const uint8_t D10 = 1;
A skusil som aj FALLING aj CHANGE a nic.Stale bez zmeny.
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa lucky62 » 15 Jún 2017, 07:56

Skús v prerušovacej rutine nepoužívať delay().... a ani Serial.print/println...

citujem odtiaľto: https://www.arduino.cc/en/Reference/AttachInterrupt
Since delay() requires interrupts to work, it will not work if called inside an ISR.
Poučné čítanie tu: http://gammon.com.au/interrupts

Na stlačenie tlačidla používaj interrupt mode FALLING namiesto LOW. LOW vyvoláva prerušenie opakovane, kým tlačidlo bude stlačené...
Na tom linku je aj príklad - úplne na spodku stránky. Prerušovacia rutina má byť čo najkratšia...
Ja by som to riešil nejako takto...

Kód: Vybrať všetko

volatile bool stlacene = false;

void loop() {
  if (stlacene == true) {
    stlacene = false;
    digitalWrite(led, HIGH);
    Serial.println("ON");
    delay(500);
    digitalWrite(led, LOW);
    Serial.println("OFF");
  }
}

void prerus() {
  stlacene = true;
}
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa bebeno28 » 15 Jún 2017, 11:59

Dakujem za odpoved.
Vcera sa mi podarilo spojaznit aspon to aby mi prerusenie zacalo fungovat.
Co sa tika delay () tak tiez som postrehol ze to robi hluposti ked je v rutine pre prerusenie pouzite ale niekde som cital ze sa aj na zaciatku rutiny zakazuje prerusenie a na konci sa zase povoluje.
Dnes mam este cas tak idem si to nastudovat.

Teraz ma napadlo. Dufm že sa bavime o preruseni pre ESP8266. Pretoze prerusenie na Arduine mi funguje tak ako ma len s ESP mam problem.

A prečo ta rutina ktoru ste napisal je v void loop ? To co chcem spravit v preruseni by malo byt mimo viod loop. Alebo sa mýlim ?

Dakujem
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa lucky62 » 15 Jún 2017, 19:46

Ide o to, že ISR teda obsluha prerušenia by mala byť čo najkratšia, aby neblokovala iné prerušenia a neovplyvňovala veľmi ostatné veci...

Takže v prerušení sa len nastaví príznak, že bolo stlačené tlačidlo a zbytok vykoná hlavná slučka.
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa bebeno28 » 15 Jún 2017, 19:48

Aha tak tomu rozumiem a ako by ste vyriesil osetrenie zakmytu tlacitka ked sa snima cez prerusenie?

Dakujem
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa lucky62 » 15 Jún 2017, 20:05

Ideálne ošetriť na úrovni hardware. :-)

Prípadne softvérové riešenie je, že v hlavnej slučke sa ten príznak bude nulovať s oneskorením. To že ho prerušovacia rutina nastaví niekoľkokrát, nebude vadiť. Tu je upravená hlavná slučka, ktorú som uviedol predtým. Príznak sa teraz bude nulovať až po 500ms, čo je určite dostatočný čas...

Kód: Vybrať všetko

void loop() {
  if (stlacene == true) {
    digitalWrite(led, HIGH);
    Serial.println("ON");
    delay(500);
    digitalWrite(led, LOW);
    Serial.println("OFF");
    stlacene = false; // toto bolo presunuté
  }
}
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa bebeno28 » 15 Jún 2017, 20:14

Aha tak už to chápem. Dakujem
Len predsa sa ešte spýtam.

Ale pokial bude kod v hlavnej smyčke dhlší tak tam bude oneskorenie po stlačení tlačidla pokila príde k vyhodnoteniu a vykonaniu danej funkcie pre tlacidlo, teda pokila príde k podmienke if pre tlačidlo ako ste napísal.

Dakujem
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa lucky62 » 15 Jún 2017, 21:24

trochu krkolomne položená otázka.. skoro som nepochopil, na čo sa pýtaš...

Ale snáď áno.

Keď bude v hlavnej slučke kód, ktorý bude trvať dlho, tak samozrejme odozva na stlačenie tlačidla, bude oneskorená.
Je na programátorovi, aby to naprogramoval vyhovujúcim spôsobom. Ten príznak stlačenia tlačidla môžeš testovať aj počas dlhých slučiek.
Ak sa zistí, že bolo stlačené, zavoláš obslužnú rutinu, ak nebolo, pokračuješ v programe...
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: Arduino IDE + NodeMCU v1.0 + Interrupt

Príspevok od používateľa bebeno28 » 15 Jún 2017, 21:41

Dakujem za rady.
Mne sa zatial podarilo spravit to na com som pracovl aj klasicky aj bez prerusenia.

Pracoval som na zobrazovacej jednotke pre meteostanicu ktora je zostavena z ESP modulu + ESP easy firmweru a cidla BME280 a zaroven aj zobrazenie teploty a ci je zanuty ohrav v nadrzi pre vodu ( tiez ESP easy a DS cidlo).

Vsetko komunikuje cez Wifi a pomocou json su prijimane data.

Link pre nazornu ukazku - https://youtu.be/HnH88P5zECw
kod pre ukazku v prilohe.
Prílohy
Meteostation-External_LCD_by_ESP8266.rar
ESP+LCD+json
(6.25 KiB) 36 stiahnutí
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok