Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Temp/fukt måling med ESP8266


Actibus

Anbefalte innlegg

Fikk min ESP8266 NodeMCU dev kit i posten igår, tanken var å prøve den med Arduino plugin, som er men t å få støtte for den etterhvert.

Jeg skal bruke den hovedsaklig for temp/fukt måling med DHT11 følere, etter litt inspirasjon fra Tasker plugin tråden her på forumet, hvor man kan styre ting via JSON tenkte jeg at det burde jo gå ann å bruke for å overføre målinger fra ESP8266 også.

 

Kan godt hende det finnes en lettere måte eller mer elegant måte, men jeg syntes nå det var enkelt og greit å få til

 

 

Modifisert scriptet fra denne siden http://randomnerdtutorials.com/esp8266-dht11dht22-temperature-and-humidity-web-server-with-arduino-ide/

 


/*********
  Rui Santos
  Complete project details at http://randomnerdtutorials.com  
*********/

// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include "DHT.h"
#include <ESP8266HTTPClient.h>

// Uncomment one of the lines below for whatever DHT sensor type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Replace with your network details
const char* ssid = "DIN SSID";
const char* password = "DITT PASSORD";
String lastTemp;
String lastFukt;
IPAddress ip(192, 168, 1, 203);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(192, 168, 1, 1);


// DHT Sensor
const int DHTPin = 5;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);

// Temporary variables
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);

  dht.begin();
  
  // Connecting to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  String s = WiFi.macAddress();
  Serial.println(s);
  Serial.println(WiFi.macAddress());
  

  
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());
}

// runs over and over again
void loop() {
  float temp = dht.readTemperature();
  float fukt = dht.readHumidity();
  String stringFukt = String(fukt);
  String stringTemp = String(temp);
  

  
  HTTPClient http;
  HTTPClient httpFukt;
  
  
if(stringTemp != lastTemp)
{
Serial.println("Temp endret");
Serial.println("Temp er:"+stringTemp+" Forrige var:"+lastTemp);
http.begin("http://192.168.1.61/JSON?request=controldevicebyvalue&ref=85&value="+stringTemp);
int httpCode = http.GET();
//http.writeToStream(&Serial);
http.end();
lastTemp = stringTemp;
delay(3000);
}


if(stringFukt != lastFukt)
{
Serial.println("Fukt endret");
Serial.println("Fukt er:"+stringFukt+"Forrige var:"+lastFukt);
httpFukt.begin("http://192.168.1.61/JSON?request=controldevicebyvalue&ref=86&value="+stringFukt);
int httpCodeFukt = httpFukt.GET();
//httpFukt.writeToStream(&Serial);
httpFukt.end();
lastFukt = stringFukt;
delay(3000);
}  
delay(30000); //Venter 30 sek før ny måling

}   

 

Laget 2 nye devices i HS3, satt de som dimmbare og satt value range til mellom 0-100 (alle følerne står inne og vil ikke oppleve minusgrader), regner med det ikke er noe problem å sette de til minus ved behov(?)

 

 

temp_snip.PNG

  • Like 1
Lenke til kommentar
Del på andre sider

Har sett den der ja, begynte først å prøve litt med den, men syntes det ble så mye kode å styre med, spesielt når det antagelig ikke vil fungere uansett når han som lager Arduino pluginen får utviklet den funksjonaliteten

Lenke til kommentar
Del på andre sider

Jeg har som skrevet over sett på den filen som ligger i linken, men syntes det var lite oversiktelig å se ha som måtte endres ifht filen jeg har selv, spesielt da jeg bruker API oppsettet.

Hadde nok funnet ut av det, men orket ikke styre med det, iogmed at den blir offisielt støttet av Arduino pluginen etterhvert.

 

Og for de som ikke har kjøpt arduino pluginen, så funker koden min uten :)

Endret av Actibus
  • Like 1
Lenke til kommentar
Del på andre sider

Det er bare litt overraskende at det oppleves som lettere å skrive sitt eget script, enn å endre 4-5 linjer i et ferdig oppsett, men gjør det som fungerer for deg. :)

 

FYI, disse linjene endres (litt ned i filen):

IPAddress ip(192, 168, 1, 195);     //IP entered in HS config.
IPAddress gateway(192, 168, 1, 1);     //Gateway
const unsigned int localPort = 9000;      //port entered in HS config.
IPAddress HomeseerIP(192, 168, 1, 178); //Homeseer IP address

 

Lenke til kommentar
Del på andre sider

Det er jo mye mer som må endres, selvfølgelig for å bruke akkurat det scriptet han har postet er det bare de linjene som må endres, men for at jeg skal kunne bruke mitt eget script som jeg har i en eksisterende ino fil idag, så må jeg jo legge inn all kode som hører til ESP8266 fra hans Homeseer.ino script og inn i mitt, og siden han ikke har kommentert ut alle linjene han har endret/lagt til/fjernet så ble det mer jobb, syntes nå jeg.

 

Og hans .ino fil er jo basert på Normal og ikke API (valget man gjør når man lager nytt board i pluginen), jeg kjører API fordi jeg har custom kode som kjører på arduinoen og sender videre til HS, da blir den enda mer forvirrende at det ikke er kommentert inn hva som er lagt til for å bruke ESP8266.

 

 

Endret av Actibus
Lenke til kommentar
Del på andre sider

Ja, OK. Jeg hadde nok bare hentet verdien inn fra ESP8266, og behandlet den der for å unngå å bruke API, men alt er mulig.

Det er jo det som er så greit med Arduinoer. :) 

 

... og som du også fint demonstrerer er det jo veldig enkelt å bruke JSON-interfacet også. :) 

Lenke til kommentar
Del på andre sider

  • 6 måneder senere...

Jeg prøvde meg på dette, men det var jaggu ikke enkelt!

 

Slet med at jeg ikke fikk noe output i console, ser ut til at den må ligge åpen når man sender sketchen?

Jeg slet med å bruke rett PIN, jeg brukte 4 (som jeg trodde var 6), men det er visst feil - anbefales å bruke f.eks D6, da den konstanten "oversettes" til intern PIN-nummer basert på valgt board.

 

I tillegg har jeg jo TLS-sertifikat og passord på min HS, så da kunne ikke HTTPClient brukes, måtte bruke WifiClientSecure. Oppå det hele så hadde jeg ingen ciphers som NodeMCU støtter på serveren, så jeg måtte endre NGINX-oppsettet for at det skulle fungere. 

 
EDIT:
Optimaliserte koden litt og la til "protothreading" slik at den bedre kan utføre "parallelle" oppgaver. Kanskje ikke så stor greie akkurat her, men om man legger til flere sensorer, så kan jo det bli viktig. :) 
 
// http://platformio.org/lib/show/721/TaskScheduler/examples
#include <TaskScheduler.h>
void checkDHT();
void checkWifi();
Task tskCheckDHT(30000, TASK_FOREVER, &checkDHT);
Task tskCheckWifi(10000, TASK_FOREVER, &checkWifi);
Scheduler runner;

// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include "DHT.h"
#include <WiFiClientSecure.h>

// Use WiFiClientSecure class to create TLS connection
// https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino
WiFiClientSecure client;

// Uncomment one of the lines below for whatever DHT sensor type you're using!
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Replace with your network details
const char* ssid = "...";
const char* password = "...";
String lastTemperature;
String lastHumidity;
IPAddress ip(192, 168, 1, 3);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(192, 168, 1, 1);
IPAddress dns(192, 168, 1, 2);

const char* host = "HS3";
const int httpsPort = 443;

// DHT Sensor
const int DHTPin = D6;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);

void checkDHT() {
  Serial.println("Sjekker DHT");

  String strHumidity = String((int)(dht.readHumidity() + 0.5));
  String strTemperature = String(dht.readTemperature());

  if (strTemperature != lastTemperature) {
    Serial.println("Temp er:" + strTemperature + " - Forrige var:" + lastTemperature);
    sendDataToHS(520, strTemperature);
    lastTemperature = strTemperature;
  }

  if (strHumidity != lastHumidity) {
    Serial.println("Fukt er:" + strHumidity + " - Forrige var:" + lastHumidity);
    sendDataToHS(521, strHumidity);
    lastHumidity = strHumidity;
  }
  Serial.println("END: Sjekker DHT");
}

void checkWifi() {
  Serial.println("Sjekker wifi");
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Mistet wifi, reconnect...");
    WiFi.begin(ssid, password);
  }
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("END: Sjekker wifi");
}

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);

  dht.begin();

  // Connecting to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(ip, gateway, subnet, dns);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println(WiFi.macAddress());
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());

  configTime(3 * 3600, 3600, "pool.ntp.org", "time.nist.gov");

  runner.init();
  runner.addTask(tskCheckDHT);
  runner.addTask(tskCheckWifi);
  tskCheckDHT.enable();
  tskCheckWifi.enable();
}

// runs over and over again
void loop() {
  runner.execute();
}

bool sendDataToHS(int dvRef, String data) {
  if (!client.connect(host, httpsPort)) {
    Serial.println("Connection failed");
    return false;
  }

  String url = "/JSON?request=controldevicebyvalue&ref=" + String(dvRef) + "&value=" + String(data);
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Basic BASE64-STRENG-HER\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  Serial.println("Request sent (device " + String(dvRef) + ", data " + String(data) + ")");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      return true;
      break;
    }
  }
  return false;
}

 

 
Endret av ZoRaC
Lenke til kommentar
Del på andre sider

  • 1 år senere...

Rotar opp igjen denne gamle tråden eg...

Har fått tak i ein ESP8266 med DHT11 temp- og fuktsensor, konfigurert denne med tilsvarande kode som du har brukt og fått den på nettverket. Alt vel så langt.

Men slit med å konfigurere devices tilsvarande som du har gjort. Har du litt meir detaljar om desse, @ZoRaC?

Lenke til kommentar
Del på andre sider

2 minutter siden, bjornepappa skrev:

Men slit med å konfigurere devices tilsvarande som du har gjort. Har du litt meir detaljar om desse, @ZoRaC?

 

Det er bare å gå på «device view» og lage to nye devicer med den grønne plussen oppe til høyre - en for temp og en for fukt. Legg inn at den skal akseptere verdier fra -50 til 50 og fra 0 til 100. 

 

Bytt så ut deviceIDene i scriptet mitt med dine. :) 

Lenke til kommentar
Del på andre sider

16 minutter siden, bjornepappa skrev:

Og tilsvarande i den andre er 520 og 521?

 

Jepp. :) 

 

16 minutter siden, bjornepappa skrev:

Skjønnar eg det rett at du ikkje skal legge inn IP eller andre data til HS-server?

 

På den første koden til @Actibus så står IPen på samme linje som devID. I min kode legger du det in i «host»-variabelen. Merk an min versjon bruker HTTPS og brukernavn/passord til HS. Hvis du ikke har det er det nok enklere å bruke @Actibus sin versjon. :) 

Lenke til kommentar
Del på andre sider

Trur eg har konfigurert i HomeSeer no, men det er noko feil. Får denne feilmeldingen gang på gang i HS-loggen:

mai-26 07:46:01   Warning JSON controldevicebyvalue caused an error: Inndatastrengen hadde ugyldig format.

 

Sånn ser devicane ut i HS, er det noko åpenbart feil?

image.png.7d6edf268f04f93eeea1a50d1a26e002.png

image.png.b9e25eecd5f15e7b14b2683725284f5c.png

image.png.8942561a2f559204eea22fc837a95a52.png

 

Lenke til kommentar
Del på andre sider

3 minutter siden, bjornepappa skrev:

Trur eg har konfigurert i HomeSeer no, men det er noko feil. Får denne feilmeldingen gang på gang i HS-loggen:

mai-26 07:46:01   Warning JSON controldevicebyvalue caused an error: Inndatastrengen hadde ugyldig format.

 

Har du oppe consolet i Aruinoe IDE og ser at den gir riktige verdier? Hvis den ikke får kontakt med DHTen så vil den lese verdiene som «NaN» og det godtar ikke HS som verdi.

Lenke til kommentar
Del på andre sider

2 minutter siden, bjornepappa skrev:

Ja, den gir verdier der i Arduino...

 

Får du ingen verdier over til HS?

Jeg får også slike i loggen med jevne mellomrom, for det virker som den av og til får NaN-verdier. 

Lenke til kommentar
Del på andre sider

Ingen verdiar til HS dessverre, kun samme feilmelding om og om igjen kvar gang det blir sendt data.

Sånn ser det ut i Arduino, som du nevner er det ein del "nan" inni mellom, men stort sett er det gyldige verdiar for både temp og fukt.

 

image.png.cd3bf9985806edb8104bf65fd10fbf6f.png

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.