Skocz do zawartości

NodeMCU v3 i 8 przekaznikow + odczyt wartosci z strony www


Pomocna odpowiedź

Napisano

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 ? 

(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
#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.

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.

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

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).

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 ?

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.

 

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 !

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...