Skocz do zawartości
Mrpatryk

NodeMCU v3 i 8 przekaznikow + odczyt wartosci z strony www

Pomocna odpowiedź

Witam mam nodemcu v3  i moduł z 8 przekaźnikami, wszystko fajnie podłączone. Program na nodemcu v3 sprawdza wartość na stronie - następnie zapisuje je do stringa potem w ifach porównuje w tabeli jezeli wartosc danego pola jest równa 1 ma załączyć przekaźnik. i tak też się dzieje, tylko problem jest tutaj w tym ze w pętli loop działa ta pętla w koło i przekaźnik się włącza i wyłącza. Stąd me pytanie: czy da się if''a zapisać poza pętlą loop, a w pętli żeby tylko program sprawdzał czy wartości z strony się nie zmieniły ? 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Piszesz "pokrętnie", masz problem z programem, a nie pokazujesz go. Jak Ci pomóc? Pytasz czy można używać IF poza pętlą loop - oczywiście, tak - od tego są funkcje, a if jest instrukcją warunkową języka programowania (nie funkcją) jakiej możesz użyć w każdym miejscu swojego programu. Napisz konkretnie o co chodzi i pokaż swój kod programu to może wtedy ktoś ci pomoże w większym stopniu niż ja w tej chwili.

3 godziny temu, Mrpatryk napisał:

a w pętli żeby tylko program sprawdzał czy wartości z strony się nie zmieniły ? 

Oczywiście, że da się tak zrobić. Właśnie mówisz o sprawdzaniu wartości czyli sprawdzaniu warunków, a do tego można użyć IF - więc o co Ci chodzi? Ja nie wiem.

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

const char* ssid = "*****";
const char* password = "******";
 const int httpPort = 80;
const char* host = "WWWW";
 char a = '1';
 char b = '0';
int przekaznik1 = D1;               //przekaznik1 podłączamy do pinu 10
int przekaznik2 = D2;
int przekaznik3 = D3;               //przekaznik1 podłączamy do pinu 10
int przekaznik4 = D4; 
int przekaznik5 = D5;               //przekaznik1 podłączamy do pinu 10
int przekaznik6 = D6; 
int przekaznik7 = D7;               //przekaznik1 podłączamy do pinu 10
int przekaznik8 = D8; 
 
bool sp1 = true;                    //zmienna boolowska sp1 do steowania stanem przekaznika1
bool sp2 = true; 
bool sp3 = true;                    //zmienna boolowska sp1 do steowania stanem przekaznika1
bool sp4 = true;
bool sp5 = true;                    //zmienna boolowska sp1 do steowania stanem przekaznika1
bool sp6 = true;
bool sp7 = true;                    //zmienna boolowska sp1 do steowania stanem przekaznika1
bool sp8 = true;
void setup() { 
 Serial.begin(9600);
 WiFi.begin(ssid, password);  
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");}
 Serial.println(WiFi.localIP());

pinMode(przekaznik1, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik2, OUTPUT);
pinMode(przekaznik3, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik4, OUTPUT);
pinMode(przekaznik5, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik6, OUTPUT);
pinMode(przekaznik7, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik8, OUTPUT);
digitalWrite(przekaznik1, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik2, HIGH); 
 digitalWrite(przekaznik3, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik4, HIGH); 
digitalWrite(przekaznik5, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik6, HIGH); 
digitalWrite(przekaznik7, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik8, HIGH);
}


void przekazniki(){HTTPClient http;  //Declare an object of class HTTPClient
   http.begin("STRONA WWW"); 

    int httpCode = http.GET();
   if (httpCode > 0) {//Send the request
 // Check the returning code
 String payload = http.getString();   //Get the request response payload
      //Serial.println(payload);  
     //delay(500);

String S = payload;
 char a1 = (S[0]);
 char a2 = (S[1]);
 char a3 = (S[2]);
 char a4 = (S[3]);
 char a5 = (S[4]);
 char a6 = (S[5]);
 char a7 = (S[6]);
 char a8 = (S[7]);
 //Serial.print(a1);
// Serial.print(a);
if (a1 == a){
  Serial.println("wlacz1");
  sp1=!sp1;                        
  digitalWrite(przekaznik1, sp1); 
 }
else {sp1=sp1;                        
  digitalWrite(przekaznik1, sp1); 
  Serial.println("Wyłaczone1");
  }

  if (a2 == a){
  Serial.println("wlacz2");
  sp2=!sp2;                        
  digitalWrite(przekaznik2, sp2); 
  }
else {sp2=sp2;                        
  digitalWrite(przekaznik2, sp2); 
  Serial.println("Wyłaczone2");
  }

  if (a3 == a){sp3=!sp3;                        
  digitalWrite(przekaznik3, sp3); 
  Serial.println("wlacz3");
  }
else {sp3=sp3;                        
  digitalWrite(przekaznik3, sp3); 
  Serial.println("Wyłaczone3");
  }
  if (a4 == a){sp4=!sp4;                        
  digitalWrite(przekaznik4, sp4); 
  Serial.println("wlacz4");
  }
else {sp4=sp4;                        
  digitalWrite(przekaznik4, sp4); 
  Serial.println("Wyłaczone4");
 }
  if (a5 == a){sp5=!sp5;                        
  digitalWrite(przekaznik5, sp5); 
  Serial.println("wlacz5");
  }
else {sp5=sp5;                        
  digitalWrite(przekaznik5, sp5); 
  Serial.println("Wyłaczone5");
  }
  if (a6 == a){sp6=!sp6;                        
  digitalWrite(przekaznik1, sp6); 
  Serial.println("wlacz6");
 }
else {sp6=sp6;                        
  digitalWrite(przekaznik6, sp6); 
  Serial.println("Wyłaczone6");
  }
 if (a7 == a){sp7=!sp7;                        
  digitalWrite(przekaznik7, sp7); 
  Serial.println("wlacz7");
 }
else {sp7=sp7;                        
  digitalWrite(przekaznik7, sp7); 
  Serial.println("Wyłaczone7");
  }
  if (a8 == a){sp8=!sp8;                        
  digitalWrite(przekaznik8, sp8); 
  Serial.println("wlacz8");
  }
else {sp1=sp8;                        
  digitalWrite(przekaznik8, sp8); 
  Serial.println("Wyłaczone8");
  }}
}
void loop() {

przekazniki();
}

Chodzi o to by IF nie wykonywał się w pętli tylko jeśli zmienna "a1" będzie miała wartość 1 to w tedy przekaźnik się załącza, a wyświetlanie zawartości oraz zapis do zmiennych z tablicy żeby ciągle był w loopie . Bo teraz porostu przekaźnik po włączeniu "pyka" włącza się i wyłącza.

Udostępnij ten post


Link to post
Share on other sites

Spróbuj może uporządkować najpierw swój kod np.:

zamiast:

pinMode(przekaznik1, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik2, OUTPUT);
pinMode(przekaznik3, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik4, OUTPUT);
pinMode(przekaznik5, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik6, OUTPUT);
pinMode(przekaznik7, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik8, OUTPUT);
digitalWrite(przekaznik1, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik2, HIGH); 
digitalWrite(przekaznik3, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik4, HIGH); 
digitalWrite(przekaznik5, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik6, HIGH); 
digitalWrite(przekaznik7, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik8, HIGH);

można spróbować napisać np.:

for(int k=przekaznik1;k<=przekaznik8;k++) { pinMode(k,OUTPUT); digitalWrite(k,HIGH); }

Nie mam pod ręka teraz ESP ale to powinno być raczej OK. Zwróć uwagę, że Twoje ESP generuje bardzo duży ruch w sieci WiFi. Pętla loop() jest wykonywana bardzo szybko więc ESP wysyła duuużo zapytań GET do serwera. Można przecież odwrotnie serwer jest na ESP i czeka na polecenia np; http://SERWER_ESP_IP/przekaznik?nr=1&stan=ON

Przy takim podejściu ruch w sieci będzie pewnie mniejszy. Ja bym napisał oddzielną funkcję do obsługi pojedynczego przekaźnika np. przekaznik(int numer, int stan). Funkcję wywoływałbym np w pętli gdzie "dekodujesz" odebrane dane.

3 godziny temu, Mrpatryk napisał:

Chodzi o to by IF nie wykonywał się w pętli tylko jeśli zmienna "a1" będzie miała wartość 1

Ale Twój warunek jest inny Ty sprawdzasz if(a1==a)..... a tutaj a nie jest równe 1 lecz '1' jak wcześniej deklarujesz. Poza tym w else piszesz sp1=sp1 - czemu to ma służyć?

Przemyśl sobie na początek swój algorytm.

Udostępnij ten post


Link to post
Share on other sites
Dnia 10.11.2018 o 11:33, Belferek napisał:

Spróbuj może uporządkować najpierw swój kod np.:

zamiast:


pinMode(przekaznik1, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik2, OUTPUT);
pinMode(przekaznik3, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik4, OUTPUT);
pinMode(przekaznik5, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik6, OUTPUT);
pinMode(przekaznik7, OUTPUT);       //przekaznik1 jako wyjście
pinMode(przekaznik8, OUTPUT);
digitalWrite(przekaznik1, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik2, HIGH); 
digitalWrite(przekaznik3, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik4, HIGH); 
digitalWrite(przekaznik5, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik6, HIGH); 
digitalWrite(przekaznik7, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik8, HIGH);

można spróbować napisać np.:


for(int k=przekaznik1;k<=przekaznik8;k++) { pinMode(k,OUTPUT); digitalWrite(k,HIGH); }

Nie mam pod ręka teraz ESP ale to powinno być raczej OK. Zwróć uwagę, że Twoje ESP generuje bardzo duży ruch w sieci WiFi. Pętla loop() jest wykonywana bardzo szybko więc ESP wysyła duuużo zapytań GET do serwera. Można przecież odwrotnie serwer jest na ESP i czeka na polecenia np; http://SERWER_ESP_IP/przekaznik?nr=1&stan=ON

Przy takim podejściu ruch w sieci będzie pewnie mniejszy. Ja bym napisał oddzielną funkcję do obsługi pojedynczego przekaźnika np. przekaznik(int numer, int stan). Funkcję wywoływałbym np w pętli gdzie "dekodujesz" odebrane dane.

Ale Twój warunek jest inny Ty sprawdzasz if(a1==a)..... a tutaj a nie jest równe 1 lecz '1' jak wcześniej deklarujesz. Poza tym w else piszesz sp1=sp1 - czemu to ma służyć?

Przemyśl sobie na początek swój algorytm.

Dopisalem For zamiast ustawiania na stan wysoki itp , co do tego żeby na esp postawic serwer to jest taki problem ze moj serwer miałby różne IP. Dane ze strony w postawci ON=1 i oFF =0 przesyłam do bazy danych, ESP odczytuje wartosc w postaci liczby 00000000, nastepnie dzieli do tablicy i w tedy porównuje np pierwsza cyfre w ifie . 

Przerobiłem ten programik i działa mi fajnie , jednak to "for" które napisałeś, nie działa . Mam teraz taki problem że szósty przekaznik nie działa, moduł przekazników jest sprawdzony i działa poprawnie , gdzy właczam 6 przekaznik , załacza się pierwszy a nie 6sty, nie wiem dlaczego co robie nie tak ? 

Podłaczenie przekaznikow, 

Gnd- Gnd 

Vcc=5v (modul przekazników i nodemcu (VIN)),

przekaznik 1- D1,
przekaznik 2 -D2,
przekaznik 3-D3,
przekaznik 4-D4,
przekaznik 5-D5,
przekaznik 6-D6,(problem, nie działa wgl).
przekaznik 7-D7,
przekaznik 8-D8.

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

const char* ssid = "***";
const char* password = "****";
 const int httpPort = 80;
const char* host = "www";
 char a = '1';
 char b = '0';
int przekaznik1 = D1;               
int przekaznik2 = D2;
int przekaznik3 = D3;               
int przekaznik4 = D4; 
int przekaznik5 = D5;               
int przekaznik6 = D6; 
int przekaznik7 = D7;               
int przekaznik8 = D8; 
 



void setup() { 
 Serial.begin(9600);
 WiFi.begin(ssid, password);  
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");}
 Serial.println(WiFi.localIP());

pinMode(przekaznik1, OUTPUT);      
pinMode(przekaznik2, OUTPUT);
pinMode(przekaznik3, OUTPUT);       
pinMode(przekaznik4, OUTPUT);
pinMode(przekaznik5, OUTPUT);    
pinMode(przekaznik6, OUTPUT);
pinMode(przekaznik7, OUTPUT);      
pinMode(przekaznik8, OUTPUT);
digitalWrite(przekaznik1, HIGH);   
digitalWrite(przekaznik2, HIGH); 
 digitalWrite(przekaznik3, HIGH);   
digitalWrite(przekaznik4, HIGH); 
digitalWrite(przekaznik5, HIGH);    
digitalWrite(przekaznik6, HIGH); 
digitalWrite(przekaznik7, HIGH);    
digitalWrite(przekaznik8, HIGH);

 

 
}



void loop(){

HTTPClient http;  //Declare an object of class HTTPClient
   http.begin("www"); 

    int httpCode = http.GET();
   if (httpCode > 0) {//Send the request
 // Check the returning code
 String payload = http.getString();   //Get the request response payload
      

String S = payload;
char a1 = (S[0]);
char a2 = (S[1]);
char  a3 = (S[2]);
char  a4 = (S[3]);
char a5 = (S[4]);
 char a6 = (S[5]);
char a7 = (S[6]);
 char a8 = (S[7]);
Serial.println(a6);
Serial.println(a);
 if (a1 == a){
  Serial.println("wlacz1");
                       
  digitalWrite(przekaznik1, LOW);
  
 
 }
else {                       
  digitalWrite(przekaznik1, HIGH); 
  Serial.println("Wyłaczone1");
  }

  if (a2 == a){
  Serial.println("wlacz2");
  digitalWrite(przekaznik2, LOW);
  
  }
else {                        
  digitalWrite(przekaznik2, HIGH); 
  Serial.println("Wyłaczone2"); 
  }

  if (a3 == a){                        
  digitalWrite(przekaznik3, LOW); 
  Serial.println("wlacz3"); 
  }
else {                    
  digitalWrite(przekaznik3,HIGH); 
  Serial.println("Wyłaczone3"); 
  }
  if (a4 == a){                       
  digitalWrite(przekaznik4,LOW); 
  Serial.println("wlacz4"); 
  }
else {                       
  digitalWrite(przekaznik4,HIGH ); 
  Serial.println("Wyłaczone4"); 
 }
  if (a5 == a){                        
  digitalWrite(przekaznik5, LOW); 
  Serial.println("wlacz5"); 
  }
else {                        
  digitalWrite(przekaznik5, HIGH); 
  Serial.println("Wyłaczone5"); 
  }
  if (a6 == a){                     
  digitalWrite(przekaznik1, LOW); 
  Serial.println("wlacz6");
 }
else {                    
  digitalWrite(przekaznik6, HIGH); 
  Serial.println("Wyłaczone6");
  }
 if (a7 == a){                        
  digitalWrite(przekaznik7, LOW); 
  Serial.println("wlacz7"); 
 }
else {                        
  digitalWrite(przekaznik7, HIGH); 
  Serial.println("Wyłaczone7"); 
  }
  if (a8 == a){                        
  digitalWrite(przekaznik8, LOW); 
  Serial.println("wlacz8"); 
  }
else {                       
  digitalWrite(przekaznik8, HIGH); 
  Serial.println("Wyłaczone8"); 
  }


delay(1000);
}
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Może użyj websocket, będzie działać bardziej responsywnie. Do takiej prostej rzeczy nawet nie trzeba zewnętrznego serwera WWW: websocket . W przykładzie są 4 przekaźniki sterowane z WWW i cztery pola gdzie są wysyłane informacje z ESP, np. 4 temperatury, czy jakieś zmienne. Można łatwo rozbudować o kolejne 4 przekaźniki. Pewnie da się i tak, że masz serwer zupełnie osobno, a przesyłane są tylko zdarzenia między serwerem i klientem (wtedy ESP byłby klientem). Nie ma tu konieczności odświeżania co określony czas, ESP dostaje info że coś się zadziało na WWW natychmiast, a w drugą stronę wysyła dane kiedy potrzebuje (np. program zmienił z jakiegoś powodu stan przekaźnika).

Udostępnij ten post


Link to post
Share on other sites

Jednak chcialbym zostac przy moim kodzie. Dziala tylko na tym d6 nie dziala. Nienwiem czy to jest zwiazane z tym ze na tym pinie niby wykazuje ze jest pin mosi albo miso bo juz nie pamietam. Bo kod dziala i wszystkie przekazniczki dzialaja. Oprocz tego podpietego do d6 . Jakies pomysly ?

Udostępnij ten post


Link to post
Share on other sites

Tak z tym  for w takim kształcie to się nie mogło udać, moja wina :-(.  Chodzi o to, że jeśli by tak zrobić jak proponowałem trzeba by się nie posługiwać stałymi typu D0, D1.... lecz numerami portów GPIO, a tu się for z inkrementacją o 1 nie sprawdzi. Sorki za zamieszanie.

 

Udostępnij ten post


Link to post
Share on other sites

no ok. Przeciez nic sie nie stalo. Teraz borykam sie z tym D6 . Nie wiem dlaczego poprostu nie dziala. Wartosc prawidlowa. Serial port wyswietla wlacz6  a sygnal ktory ma wyslac na przekaznik nie. Tzn nie dziala . Wszystkie inne smigaja a ten jeden niestety nie

o kur... wlasnie przeczytalem ten kodzik szybka analiza i juz wiem gdzie jest blad !

Udostępnij ten post


Link to post
Share on other sites
Dnia 10.11.2018 o 07:29, Mrpatryk napisał:

if (a6 == a){sp6=!sp6; digitalWrite(przekaznik1, sp6); Serial.println("wlacz6"); }

Może dlatego...

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Wlasnie tak!. Super kolejny problem dotyczacy nodemcu za mna:) dzieki za zaangazowanie .

Udostępnij ten post


Link to post
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!

Gość
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...