pomaly arduino kod nodeMCU V3

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

loksiklubos
Stály člen
Stály člen
Príspevky: 349
Dátum registrácie: 23 Sep 2013, 22:10
Vek: 36

pomaly arduino kod nodeMCU V3

Príspevok od používateľa loksiklubos » 29 Apr 2018, 13:17

Zdravim mam nodeMCU V3 a ked nahram akykolvek kod tak v serial monitore to dost dlho trva kym skoci dalsi riadok cca kazdu sekundu.

Hlavne ked nahram kod ktory ma aspom 500-1000riadkov tak dost dlho trva kym prebehne cely kod a zopne alebo zobrazi teplotu niekedy to trva aj dobru minutu.

Da sa to nejakym sposobom urychlit lebo pan ktory mi robil jeden projekt tak jemu to ide o dost rychlejsie ako mne
0

martin knocik
Ultimate člen
Ultimate člen
Príspevky: 1639
Dátum registrácie: 23 Jan 2008, 00:00
Bydlisko: Trenčianska Turná
Vek: 33
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa martin knocik » 29 Apr 2018, 16:53

Napíš efektívny kód na mieru použitého MCU bez pomalých arduino knižníc.
0
http://mkbci.com

FEL UNIZA 2015, Ing.

ľudstvo je vírus ktorý napadol Zem

nerobme si ťažkú hlavu z debilov čo nám ani po členky nesiahajú, buďme radi že my dačo dokážeme a smejme sa im akí sú sprostí

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa jirka.jirka. » 29 Apr 2018, 17:08

Typuju, že máš všechno v jedné symčce.
U arduino myslím:

Kód: Vybrať všetko

void loop()
{}
Pak do ní vložíš 4x 250ms delay a problém je na světě.

Chce to použít přerušení.

Takže jak je psáno výše.

Zabij arduino knihovny a val to sám. Ideálně v čistém C. Potom se ti dostane velké pomoci. Na arduino kekel už je zde víc a víc lidí alergických. :finga:

Tady je "asi" postup jak na to: https://www.penninkhof.com/2015/06/esp8 ... m-eclipse/. Ale jistý nejsem. moc jsem to nestudoval, jenom jsem zkusil 10s googlit.
0

loksiklubos
Stály člen
Stály člen
Príspevky: 349
Dátum registrácie: 23 Sep 2013, 22:10
Vek: 36

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa loksiklubos » 29 Apr 2018, 19:10

prikladam subor
Prílohy
bazen_v1.zip
(2.5 KiB) 54 stiahnutí
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa jirka.jirka. » 29 Apr 2018, 19:26

Moc jsem to neprocházel, protože to je přesně jak jsem říkal (a ne jen já). Všecko nacpané v jedné smyčce.

Ale když jsem si vyhledal "delay"

Kód: Vybrať všetko

void stav_termostat2()
V této fci máš delay

Kód: Vybrať všetko

delay(500);
A ten ti program zabije přesně na 500ms (neboli, program nedělá nic 500ms.

Dále:

Kód: Vybrať všetko

if (client.verify(fingerprint, host)) {} else {}
Copak jsi tím asi myslel?

Opravdu rozumíme tomuto?

Kód: Vybrať všetko

if; else; ifelse
Nějak se mi zdá, že je to tam možná trošku doplantané.


A ta hlavní smyčka se mi taky moc nezdá:

Kód: Vybrať všetko

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    odosli_teploty();
    aktualizuj_termostat1();
    aktualizuj_termostat2();
    referencia_termostat1();
    referencia_termostat2();
    stav_termostat1();
    stav_termostat2();
    stav_rele1();
    stav_rele2();
    stav_rele3();
    stav_rele4(); 
    skontroluj_reset();   
    if(pocitadlo>=3){
      odosli_teplotydb();
      }
    WiFi.begin(ssid, password);
  } else {
     odosli_teploty();
    aktualizuj_termostat1();
    aktualizuj_termostat2();
    referencia_termostat1();
    referencia_termostat2();
    stav_termostat1();
    stav_termostat2();
    stav_rele1();
    stav_rele2();
    stav_rele3();
    stav_rele4(); 
    skontroluj_reset();
     if(pocitadlo>=3){
      odosli_teplotydb();
      }
  }

  delay(50);

}
Nemělo by být

Kód: Vybrať všetko

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
  } else {
     odosli_teploty();
    aktualizuj_termostat1();
    aktualizuj_termostat2();
    referencia_termostat1();
    referencia_termostat2();
    stav_termostat1();
    stav_termostat2();
    stav_rele1();
    stav_rele2();
    stav_rele3();
    stav_rele4(); 
    skontroluj_reset();
     if(pocitadlo>=3){
      odosli_teplotydb();
      }
  }

  delay(50);

} 
Dále. Nešlo by se vyhnout floatům? Nevím co je tam procesor, ale tímto můžeš procesu poměrně ulehčit. Teplotu můžeš zpracovávat jako například 2580 (což by bylo 25.80°C). Stačí vyčíst data z DS18B20 a patřičně vynásobit a přičíst. Float v tomto případě je značně nevhodný. Zdržuje, pokud se nepoužije správně.
0

loksiklubos
Stály člen
Stály člen
Príspevky: 349
Dátum registrácie: 23 Sep 2013, 22:10
Vek: 36

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa loksiklubos » 29 Apr 2018, 21:28

skusel som to upravit tak moc to nepomohlo mohla by byt est daka chyba v kode
0

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa alidedko » 29 Apr 2018, 21:50

Napadlo mi, ma ten nodeMCU aj nieco ako poistky?

Ci nie je trosicku inak nastaveny oscilator, ak vobec ...
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

loksiklubos
Stály člen
Stály člen
Príspevky: 349
Dátum registrácie: 23 Sep 2013, 22:10
Vek: 36

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa loksiklubos » 29 Apr 2018, 21:53

podla mna v kode problem nebude kedze skusal som aj ine kody a je to podobne
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa jirka.jirka. » 29 Apr 2018, 22:14

Tak to nevím.
Ale jednoduchý pokus.

Vem si ledku, připoj k pinu a rozblikej.
Pokud nemáš osciloskop, tak si to stopni. Takže třeba blikání 1s.

-- Spojený príspevok 29 Apr 2018, 21:17 --

Ale pokud WiFi funguje, tak je možné, že bys měl blbé knihovny? Ale tady do toho nevidím.

To je to, když si nenapíšeš obsluhu sám. Pak do toho člověk nevidí a blbě se radí.
0

kamilko
Stály člen
Stály člen
Príspevky: 269
Dátum registrácie: 21 Okt 2017, 14:07
Bydlisko: kosice

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa kamilko » 29 Apr 2018, 22:57

To si pis ze su chyby v kode a knizniciach z netu.
Prave nedavno som zahodil cely 6dnovy projekt v arduine a prepisal ho do avr studia v cecku. Aka to radost, kontrola nad kodom a istota ze viem co to robi.

Doporucujem prejst kazdu kniznicu co si tam dal.
Aj tak moze vzniknut problem ze sa budu byt kniznice.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa peterple » 29 Apr 2018, 22:59

Pán to má tiež na nodeMCU alebo na klasickom arduine?
Ten nodeMCU je 1000:1 voči klasickému arduinu, ale je tam jedno veľké ALE. To je to že ten arduino kód tam beží jaksi bokom. Ten modul je primárne určený na komunikáciu po WiFi, ale dokáže aj skompilovať a spustiť aj nejaké tie arduino hlúposti. Lenže je tam jediné jadro a tak ho nemôžeš zabiť nejakými delay volaniami. Ak totiž to jadro neobslúži WiFi podsystém do 100ms tak je reštartované watchdogom. A to je pravdepodobne dôvod prečo sa ti to tak naťahuje. Takýto procesor nemôžeš programovať ako jednoduché arduino s AVR ktoré nerobí nič iného než to čo si tam naprogramoval.

Skús si teda overiť či dochádza k reštartovaniu alebo nie.
Tu sa píše že k tomu dochádza len vtedy ak si konektnutý na wifi a to ty si.
https://www.esp8266.com/viewtopic.php?f=28&t=6379
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

loksiklubos
Stály člen
Stály člen
Príspevky: 349
Dátum registrácie: 23 Sep 2013, 22:10
Vek: 36

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa loksiklubos » 30 Apr 2018, 21:00

vedel by ste mi poskyt daku odskusanu kniznicu
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: pomaly arduino kod nodeMCU V3

Príspevok od používateľa maskrtnik01 » 30 Apr 2018, 21:29

Jeden zo základných problémov arduinistov je, že žijú v akomsi “ideálnom” svete kde je na každý problém knižnica, ktorej vnútornému fungovaniu nemusím rozumieť lebo to pôjde. Najvyšší čas precitnúť a vrátiť sa do reality.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa jirka.jirka. » 01 Máj 2018, 09:08

Perteple ti napsal.

Wifi musí být ošetřeno do 100ms. Tzn. než budeš shánět nové knihovny, které budou možná i horší, tak ten tvůj program zkus opravit tak, aby jsi tam neměl delay 500.

Tzn. dej si tam delay třeba 10. A po 50. průchodu si ty data odešli, nebo co to tam děláš.

Kód: Vybrať všetko

void stav_termostat2() {
  WiFiClientSecure client;
  if (client.verify(fingerprint, host)) {} else {}
  if (client.connect(host, httpsPort)) {
    String url = "/system/values/termostat2.txt"; 
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");
     while (client.connected()) {
     stavtermostat2 = client.readStringUntil('\n');
    if (stavtermostat2 == "\r") {
      break;
    }
  }
  stavtermostat2 = client.readStringUntil('\n');
  if(stavtermostat2=="ZAP"){
    digitalWrite(termostat2, LOW);
    Serial.println("Zapinam termostat 2 - online");
    }else if(stavtermostat2=="VYP"){
      digitalWrite(termostat2, HIGH);
      Serial.println("Vypinam termostat 2 - online");
      }
  }else if (!client.connect(host, httpsPort)) {
    Serial.println("Neuspesne pripojenie pre stav termostatu c2 - offline rezim");
   
    Serial.println("Ovladanie termostatu c2 - offline rezim");
    sensors.requestTemperatures();
    delay(500);
    String teplota2 = String(sensors.getTempCByIndex(1));
    float teplota2f = teplota2.toFloat();
    if ((referenciatermostatu2f - teplota2f) > 1) {
      digitalWrite(termostat2, HIGH);
      Serial.println("Termostat c2 vypnuty - offline");
    } else if ((referenciatermostatu2f - teplota2f) < -1) {
      digitalWrite(termostat2, LOW);
      Serial.println("Termostat c2 zapnuty - offline");
    }
  }
}
Řešení by tedy mohlo být toto:

Kód: Vybrať všetko

uint8_t counter = 0;

void stav_termostat2() {
  WiFiClientSecure client;
  if (client.verify(fingerprint, host)) {} else {}
  if (client.connect(host, httpsPort)) {
    String url = "/system/values/termostat2.txt"; 
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");
     while (client.connected()) {
     stavtermostat2 = client.readStringUntil('\n');
    if (stavtermostat2 == "\r") {
      break;
    }
  }
  stavtermostat2 = client.readStringUntil('\n');
  if(stavtermostat2=="ZAP"){
    digitalWrite(termostat2, LOW);
    Serial.println("Zapinam termostat 2 - online");
    }else if(stavtermostat2=="VYP"){
      digitalWrite(termostat2, HIGH);
      Serial.println("Vypinam termostat 2 - online");
      }
  }else if (!client.connect(host, httpsPort)) {
    Serial.println("Neuspesne pripojenie pre stav termostatu c2 - offline rezim");
   
    Serial.println("Ovladanie termostatu c2 - offline rezim");
    sensors.requestTemperatures();
	
	delay(10);	//kratka prodleva, ktera by nemusela rozhodit wifi
    counter++;	//inkremenetace promenne u ktere hodnota znaci: delay = counter*10 
	if (counter >= 50)	//zde bude mit counter 50*10 = 500ms.
	{
		String teplota2 = String(sensors.getTempCByIndex(1));
		float teplota2f = teplota2.toFloat();
		if ((referenciatermostatu2f - teplota2f) > 1) {
			digitalWrite(termostat2, HIGH);
			Serial.println("Termostat c2 vypnuty - offline");
		} else if ((referenciatermostatu2f - teplota2f) < -1) {
			digitalWrite(termostat2, LOW);
			Serial.println("Termostat c2 zapnuty - offline");
		}
	counter = 0;	//smazani promenne counter 
	}
  }
}
PS: Stále by mě zajímalo, co chtěl autor toho programu říct tímto:

Kód: Vybrať všetko

if (client.verify(fingerprint, host)) {} else {}
:rolleyes:
0

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa roboulbricht » 01 Máj 2018, 13:44

jirka.jirka., ten kód sa dá použiť na overenie odtlačku certifikátu na HTTPS stránkach. Obvykle sa to píše takto.

Kód: Vybrať všetko

if (client.verify(fingerprint, host)) {
    Serial.println("certificate matches");
  } else {
    Serial.println("certificate doesn't match");
  }
Nemusí sa to použiť, keď si dôveruješ, že je na druhej strane správny server.
0

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa roboulbricht » 01 Máj 2018, 17:24

Myšlienky o neblahom vplyve funkcie delay sú v prípade ESP8266 podľa mňa chybné. Všetci tu vychádzate z toho, že je aj v ESP8266 delay implementované tak ako je v Arduine s mikrokontrolérom ATmega328P, formou mrhania inštrukciami, kým neuplynie nastavený čas. A že to koliduje s WiFi. Ale v dokumentácii ku 2.4.1 čítam toto. Volanie funkcie delay je podľa toho práve prospešné na to, aby WiFi neskapalo.
Remember that there is a lot of code that needs to run on the chip besides the sketch when WiFi is connected. WiFi and TCP/IP libraries get a chance to handle any pending events each time the loop() function completes, OR when delay is called. If you have a loop somewhere in your sketch that takes a lot of time (>50ms) without calling delay, you might consider adding a call to delay function to keep the WiFi stack running smoothly.
https://arduino-esp8266.readthedocs.io/ ... rence.html
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa jirka.jirka. » 02 Máj 2018, 07:10

No tak se podívej do té funkce delay, jak je napsaná. Co přesně používá. Potom budeme vědět, jestli je delay napsaný tak, že dělá prázdné instrukce daný čas (nebo-li zabije procesor) a nebo je nějaká sofistikovaná a používá timer.

Co jde si z procesoru vypisuj někde do konzole (ideálně i s časem) místo debuggera, ať víš co se kde děje a tak můžeš odhalit, kde přesně problém vzniká.

Jinak tento kód, co máš v programu neudělá nic. Nemá na funkci podle mě žádný vliv. Není totiž žádná reakce.

Kód: Vybrať všetko

if (client.verify(fingerprint, host)) {} else {}


Je to to samé, jako bys napsal:

Kód: Vybrať všetko

int8_t verify = client.verify(fingerprint, host)
A když s tou proměnnou verify nic neuděláš, tak ti jen zabírá místo v paměti a zpomaluje chod, protože se musí vykonat, ale není na ní žádná reakce.
0

LukinoOl
Okoloidúci
Okoloidúci
Príspevky: 11
Dátum registrácie: 27 Júl 2016, 18:22
Bydlisko: Velký Újezd, CZ

Re: pomaly arduino kod nodeMCU V3

Príspevok od používateľa LukinoOl » 02 Máj 2018, 10:51

Chceš poradit, jak na to? Tož tedy:
1, stav relé nedávej jako String, ale jako bool / ř.18. -23. - však to je jen 0 nebo 1
2, porty pro aktivaci dej do pole a potom je aktivuj ve smyččce / ř.24. - 29. a následně 31. - 36. - libovolně můžeš měnit čísla portů jen v jednom řádku a ne v celém programu
3, odosli_teploty() a další, proč stále deklaruješ Stringy /ř.71. - 76.
Raději použij globální user defined structure např.

Kód: Vybrať všetko

struct teploty {
  float  teplota1;
  float  teplota2;
.....
};
4, pro posílání dat do klienta taktéž neustále deklaruješ dokola Stringy 68., 96., co takhle globální String pro výstup a ten přepisovat?
5, pro opakovaně prováděné funkce (referencia_termostatX, stav_termostatX, stav_releX) , je pravidlem udělat univerzální funkci, nikoliv pro každé čidlo zvlášť svoji funkci:
6, celé načítání hodnot jede neustále dokola v loopu, to potřebuješ načítat data tak často?
7, časování dělat přes proměnnou (pocitadlo)? No fuj!
8, když už to máš na NodeMcu, tak proč nepoužiješ statickou HTML v SPIFFS a do ní netaháš přes AJAX (javascript) hodnoty? Takhle musiš pořád načítat znovu stránku, abys uviděl stav.

A mnoho mnoho dalších ....

Pokud to potřebuješ vysvětlit lépe, tak po 17.00 na Skype: velky_ujezd

Lukáš
0

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