Skocz do zawartości

Czujnik jakości powietrza


Pomocna odpowiedź

while(1)to przecież to samo co while(true) czyli "jedziem w kółko".

Moja pętla serwisowa wykonuje się w setupie bo gdzieś się przecież musi musi wykonać a po co włazić do loop jeśli nie wykomujemy tam żadnego kodu? Pamiętaj, że setup() i loop() to takie fajne arduinizmy, gdybyś sobie dokładniej przeszukał własny dysk znalazłbyś plik main.cpp, który w skrócie wygląda tak:

int main(void)
{
  setup();
  for (;;) {
    loop();
  }
}

Czyli żadna magia...

co do for(;;) - nie chce Ci się zaglądać do specyfikacji języka?

Normalnie w for masz trzy wyrażenia z których każde można pominąć. Stąd for (;;) oznacza "nie wykonuj żadnego kodu na starcie, nie sprawdzaj warunku zakończenia pętli i nie wykonuj żadnego specjalnego kodu za każdym obrotem pętli". W sumie takie FOREVER, czyli while(1).

Jeśli programujesz przez OTA, po wczytaniu programu i umieszczeniu go we właściwym miejscu we flashu procek i tak zrobi reset, czyli nie musisz się martwić ilością obrotów pętli.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

11 minut temu, ethanak napisał:

while(1)to przecież to samo co while(true) czyli "jedziem w kółko".

Cenne, nie wiedziałem, dzięki:-)

for(;;) == while(1) dzięki:-))

i wszystko jasne:

13 minut temu, ethanak napisał:

Jeśli programujesz przez OTA, po wczytaniu programu i umieszczeniu go we właściwym miejscu we flashu procek i tak zrobi reset, czyli nie musisz się martwić ilością obrotów pętli.

dziękuję:)

 

Link do komentarza
Share on other sites

(edytowany)
int petla;

void setup() {
  pinMode(D2, INPUT_PULLUP);
  pinMode(D4, OUTPUT);
  if(digitalRead(D2)==LOW){
    petla=1;
    }
    else{
      petla=2;
    }
}
void loop() {
  if(petla==1){
    while(1){
  digitalWrite(D4, HIGH);  
  delay(1000);                    
  digitalWrite(D4, LOW);   
  delay(1000);                       
}
  }
  else{
    while(1){
      digitalWrite(D4, HIGH);   
  delay(200);                       
  digitalWrite(D4, LOW);    
  delay(200);     
    }
  }
}

Mój pierwszy kod z 'podwójnym programem" 😉 i działa....:-))

Takie to proste, a nie wpadłem na taki pomysł... no i mega pomocne i ułatwiające wiele rzeczy...dzięki za podrzucenie tematu...

Teraz biorę się za OTA...
 

ok, zrobiłem wszystko jak w tutorialu: http://strejczek.com/esp8266-i-arduino-ota-over-the-air-update/, pojawił mi się "port internetowy", próbuję wgrać, poprzez ten port, szkic z przykładów ESP8266wi-fi "wi-fi scan" i wywala mi :Szkic używa 252592 bajtów (24%) pamięci programu. Maksimum to 1044464 bajtów.
Zmienne globalne używają 28120 bajtów (34%) pamięci dynamicznej, pozostawiając 53800 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów.
java.io.IOException: Cannot run program "python.exe": CreateProcess error=2, Nie można odnaleźć określonego pliku
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at processing.app.helpers.ProcessUtils.exec(ProcessUtils.java:26)
    at cc.arduino.packages.Uploader.executeUploadCommand(Uploader.java:129)
    at cc.arduino.packages.uploaders.GenericNetworkUploader.uploadUsingPreferences(GenericNetworkUploader.java:99)
    at cc.arduino.UploaderUtils.upload(UploaderUtils.java:77)
    at processing.app.SketchController.upload(SketchController.java:732)
    at processing.app.SketchController.exportApplet(SketchController.java:703)
    at processing.app.Editor$UploadHandler.run(Editor.java:2042)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: CreateProcess error=2, Nie można odnaleźć określonego pliku
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 8 more
Podczas ładowania szkicu wystąpił błąd

 

Pythona zainstalowałem i daje się uruchomić z menu start poleceniem python...

Edytowano przez SOYER
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

ok, dzięki za odzew Belferek, niestety to ja nie umiem czytać ze zrozumieniem, powinna być wersja pythona 2.7.x, a ja wgrałem 3.7.coś, a ta zdaje się nie jest wspierana(przez OTA? IDE?)... teraz śmiga, udało mi się wgrać pierwszy program przez wi-fi:-)))))

teraz spróbuję połączyc OTA i "dwuprogramowość;-)" której mnie nauczyli Ethanak z Trekerem...

KOLEJNA AKTUALIZACJA;-)

@ethanaki nie tylko, zerknijcie, wkleiłem przykład "basicOTA" to mojego szkicu z "wieloprogramowoscią:-)", zgodnie z Twoimi wytycznymi:

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "xxx";
const char* password = "xxx";
void setup() {
  if(digitalRead(D2)==LOW){
   
  Serial.begin(9600);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

   ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_SPIFFS
      type = "filesystem";
    }

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  
for(;;) {
  ArduinoOTA.handle();
}                   
}
pinMode(D4,OUTPUT);
    }
  

void loop() {
  
      digitalWrite(D4, HIGH);   
  delay(200);                       
  digitalWrite(D4, LOW);    
  delay(200);     
    }
  


 

oraz wersja skrócona, tu pytanie czy nie " za bardzo"... nie wyciąłem czasem zbyt wiele? Obie wersje kompilują się bez problemu... a nie mam teraz jak wgrać do NodeMCU zeby sprawdzić...:

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "xxx";
const char* password = "xxx";
void setup() {
  if(digitalRead(D2)==LOW){
   
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(5000);
    ESP.restart();
  }

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_SPIFFS
      type = "filesystem";
    }
    });
  ArduinoOTA.begin();
  
for(;;) {
  ArduinoOTA.handle();
}                   
}
pinMode(D4,OUTPUT);
    }
  

void loop() {
  
      digitalWrite(D4, HIGH);   
  delay(200);                       
  digitalWrite(D4, LOW);    
  delay(200);     
    }
  

zapomniałem dodać w kodzie pinMode(D2, INPUT_PULLUP);.....

Edytowano przez SOYER
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

KOLEJNA EDYCJA...

Zapomniałem o yield(), oraz musialem wstawić, zgodnie z sugestią Ethanaka, powtórne sprawdzanie przycisku po 0,5s bo zdarzało się, że pomimo INPUT_PULLUP-a wylapywal stan niski czasami... 

Działają obie wersje kodu i ta dłuższa i ta skrócona, chyba lepiej uzywać tej skróconej, bo mniej miejsca zajmuje w pamięci... tak?

Oto ona:

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "xxxxxxxxx";
const char* password = "xxxxxxxxx";
void setup() {
  pinMode(D2, INPUT_PULLUP);
  if(digitalRead(D2)==LOW){
    delay(500);
    if(digitalRead(D2)==LOW){
   
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(5000);
    ESP.restart();
  }

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_SPIFFS
      type = "filesystem";
    }
    });
  ArduinoOTA.begin();
  
for(;;) {
  ArduinoOTA.handle();
  yield();
}                   
}
  }
pinMode(D4,OUTPUT);
    }
  

void loop() {
  
      digitalWrite(D4, HIGH);   
  delay(200);                       
  digitalWrite(D4, LOW);    
  delay(200);     
    }


  Program działa jak należy, po zwykłym włączeniu miga dioda, ale jeśli w czasie włączania mamy wciśnięty przycisk, nodeMCU przechodzi w "tryb OTA" i można wgrać dowolny program przez wi-fi. DZIAŁA!!! Dziękuję za pomoc.

P.S. czy to prawda, że program wgrywany OTA nie może zajmować więcej niż polowę pamięci uC?

P.S2. czy OTA też można uruchomić na arduino MEGA z ethernet shieldem??

Edytowano przez SOYER
  • Lubię! 1
Link do komentarza
Share on other sites

W pociągu jako pociągu niestety 😞 Spóźnienie 85 minut a na przesiadkę miałem przewidziane 70... ale jakoś cudem te 15 minut nadrobił.

Takie pytanko. Masz w kodzie coś takiego:

  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(5000);
    ESP.restart();
  }

Możesz to jakoś swoimi słowami opisać? Na przykład interesuje mnie, w jakim przypadku pętla wykona się więcej niż raz...

  • Lubię! 1
Link do komentarza
Share on other sites

Szczerze to tak jak napisałem wyżej, korzystałem ze szkicu przykładowego z arduino IDE "basicOTA" czy jakoś tak, który to w calości jest wklejony wyżej jako część tego dłuższego szicu. W tej krótszej wersji zostawiłem te linijki gdyż wydawały mi się ważne. Z nazw funkcji wnioskuję, że pętla wykonuje się, jeśli nie nastąpiło połączenie z wi-fi, czeka 5s i restartuje esp. Wykonuje się tak długo aż nie nastąpi skuteczne połączenie z wi-fi...

Link do komentarza
Share on other sites

w sumie będzie działać tak samo... tyle że użycie while sugeruje nieznajomość tematu.

poza tym ja wolę sprawdzać stan połączenia w loop i decydować co mam zrobić. mogę np. zrobić pomiar czystości powietrza zanim esp nawiąże połączenie. robot który coś tam robi i raz na jakiś czas zdaje sprawozdanie też nie potrzebuje nawiązania połączenia do normalnej pracy...

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Super, tzn., że jednak Ci co piszą takie przykładowe szkice do bibliotek to jednak nie zawsze fachowcy, wprawdzie efekt ten sam, ale wstawianie pętli tam gdzie ona nie ma szans się wykonać więcej niż raz jest bez sensu. Dzięki za zwrócenie uwagi na ten fragment 😉

Wracając do tematu, mam szkic który wykonuje coś tam, ale jeśli przy załączeniu urządzenia przytrzymam przycisk to uruchamia się szkic pozwalający wgrać program przez OTA.

Teraz pytanie, czy da się tak napisać ten sketch żeby dało się wgrać nowy program bez dostępu do urządzenia? Żeby stale "nasłuchiwał", "wystawiał" dostępny port internetowy jednocześnie wykonując coś zupełnie innego.... 

Jak to ugryźć? 

Edytowano przez SOYER
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.