Temperatura controlata cu Blynk

Buna ziua,

Am o problema cu programul urmator, am un modul NodeMcu (ESP8266) conectat la net prin WiFi si cu ajutorul programului Blynk activez prin butonul virual V0 iesirea unui releu in prinul D0. In pinul D4 citesc temperatura cu un senzor DS18B20. As dori ca in momentul in care activez butonul in functie de temperatura sa-mi activeze sau nu releul, la mai mult de 25 degrade sa-l opreasca si sa-l porneasca la mai putin de 24. Totul functioneaza dar serial, adica pot face sa mearga doar in functie de butonul sau doar in functie de temperatura, niciodata dupa ambele conditii. Va rog sa va aruncati o privire poate imi dati o idee. Multumesc anticipat.

Acesta este codul utilizat:


#define BLYNK_PRINT Serial   
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h> 
#define ONE_WIRE_BUS D4 
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire);

char auth[] = "r45AcOvpwGqWkSSuRXOsE0NXYnF0F-3G";
char ssid[] = "Gabriela si Mihai";
char pass[] = "Kriogenic12";

const int Relay1 = 16;// D0 pinul de iesire catre releu
double temp;

void setup() {
  Serial.begin(115200);
  pinMode(Relay1, OUTPUT);
  digitalWrite(Relay1, HIGH);
  Blynk.begin(auth, ssid, pass);
  sensors.begin();
 }

void sendTemps()
 {
 sensors.requestTemperatures(); 
float temp = sensors.getTempCByIndex(0); 
Serial.println(temp); 
Blynk.virtualWrite(V5, temp); 
} 

void loop() {
  Blynk.run();
  sendTemps();
  delay(500);
}

BLYNK_WRITE(V0)
  {
  int pinValue = param.asInt();
  if (pinValue == 1)
    {
      if (temp > 25) 
    {digitalWrite(Relay1, LOW);
    Serial.println("Relay1 Off");
    }
    else if (temp < 24)
    {digitalWrite(Relay1, HIGH);
    Serial.println("Relay On");
   }
    digitalWrite(Relay1, LOW);
    Serial.println("Relay1 Off");
    }
    
   else if (pinValue == 0)
    {
    digitalWrite(Relay1, HIGH);
    Serial.println("Relay1 On");
    }
  }

@Raileanu_Mihai please edit your post using the pencil icon at the bottom and add triple backticks at the beginning and end of your code so that it displays correctly.
Triple backticks look like this:
```

Pete.

Ok, thanks in advance for your help!

salut!

nu am timp acuma sa analizez codul foarte detailat, dar cred ca e problema cu urmatoarele chestii:

  • incearca click dreapta / auto format in arduino ide, face lucruri mirifice :slight_smile:

  • nu folosi delay in main loop, ca delayul blocheaza comunicarea cu serveru blynk

  • folosi blynk timer in loc de delay

  • in cod ai declarat global double temp, dar nici unde in cod nu ai asignat o valoare, deci el ramane permanent null. in functia sendtemps tu lucrezi cu un variabil local, dar in blynk write lucrezi cu cel global

  • tot in blynk write, dupa if si else if ai pus

digitalWrite(Relay1, LOW);
Serial.println("Relay1 Off");

care va opri releul cand e apasat butonul, indiferent de temperatura…

deci sunt multe buguri, dar astia nu prea au legatura cu blynk, ci cu cunostintele si strategia de programare. incearca sa merg pas cu pas, rand cu rand si sa-l intelegi exact ce se intampla in cod.

bafta!

Pete.

Multumesc de ajutor, am finalizat cu un slider la care tin temperatura intre 5 grade si 25. Programul a iesit asa:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>
#include <DallasTemperature.h>
#include <BlynkSimpleEsp8266.h> // bo BLYNKS
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#define RELAY0_PIN 16

char auth[] = "r45AcOvpwGqWkSSuRXOsE0NXYnF0F-3G";
char ssid[] = "Gabriela si Mihai";
char pass[] = "Kriogenic12";


BlynkTimer timer;

#define ONE_WIRE_BUS D4 // DS18B20 on arduino pin2 corresponds to D4 on physical board 4 - D2 , 5 D1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
double temp;
double setTemp;

void setup() 
{
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  DS18B20.begin();
  timer.setInterval(10000L, getSendData); //check every 10 seconds (could probable be every minute)
  pinMode(RELAY0_PIN, OUTPUT);
  digitalWrite(RELAY0_PIN, LOW);
}

void loop() 
{
  Blynk.run();  
  timer.run();  
}


void getSendData()
{
  DS18B20.requestTemperatures();
  temp = DS18B20.getTempCByIndex(0);
  Serial.println(temp);
  Blynk.virtualWrite(V5, temp); 
        if (temp > setTemp + 0.6) //+ 0,6 pt hysterezis - sa nu "tacane releul"
        {
          digitalWrite(RELAY0_PIN, HIGH); 
          Serial.print("Relay OFF");
          Blynk.virtualWrite(V38, 1023);//aprind LED-ul OFF
          Blynk.virtualWrite(V39, 0);   //sting LED-ul ON
        }
        else if (temp < (setTemp - 0.4)) //- 0,4 pt hysterezis - sa nu "tacane releul"
        {
          digitalWrite(RELAY0_PIN, LOW); 
          Serial.print("Relay On");
          Blynk.virtualWrite(V38, 0);    //sting LED-ul OFF
          Blynk.virtualWrite(V39, 1023);//aprind LED-ul ON
        }        
}
  
BLYNK_WRITE(V40)
{
  setTemp = param.asDouble(); // assigning incoming value from pin Vx to a variable
  Serial.print("V40 Slider value is: ");
  Serial.println(setTemp); 
}
1 Like

Pin D16 on the NodeMCU is GPIO0.
That’s probably not the best choice pf pins, as it can cause the NodeMCU to boot into programming mode if it’s pulled LOW on startup. More info here, courtesy of froned @wanek

Other than that, and the fact that your hysteresis might be a bit on the wide side, the code looks much better.

Pete.

arata mult mai ok, felicitari :slight_smile:

  • pt leduri cred ca valoarea maxima e 255, nu 1023.

  • vad ca ai folosit auto format. e mult mai aranjat. pt un cod si mai structurat, iti recomand sa le grupezi lucrurile similare, de exemplu incepi cu toate defineurile, lasi un rand liber, toate includurile, rand liber, toate declaratiile de variabile, rand liber, obejcturile, etc.

si in functii poti lasa cate un rand liber dupa un if, for sau alte subcategorii. nu costa nimic, si face codul mai “aerisit”, mai usor de citit.