Skocz do zawartości

ESP8266 NodeMCU - DHT22 - Web serwer


Leonarsen

Pomocna odpowiedź

Cześć,

ostatnio ćwiczę trochę z pomiarami temperatury i wilgotności czyli DHT + ESP8266.
Męczę różne konfigurację bazując na tym kodzie ze strony https://lastminuteengineers.com/esp8266-dht11-dht22-web-server-tutorial/ :

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.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

/*Put your SSID & Password*/
const char* ssid = "YourNetworkName";  // Enter SSID here
const char* password = "YourPassword";  //Enter Password here

ESP8266WebServer server(80);

// DHT Sensor
uint8_t DHTPin = D8; 
               
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);                

float Temperature;
float Humidity;
 
void setup() {
  Serial.begin(115200);
  delay(100);
  
  pinMode(DHTPin, INPUT);

  dht.begin();              

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);

  server.begin();
  Serial.println("HTTP server started");

}
void loop() {
  
  server.handleClient();
  
}

void handle_OnConnect() {

 Temperature = dht.readTemperature(); // Gets the values of the temperature
  Humidity = dht.readHumidity(); // Gets the values of the humidity 
  server.send(200, "text/html", SendHTML(Temperature,Humidity)); 
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(float Temperaturestat,float Humiditystat){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>ESP8266 Weather Report</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>ESP8266 NodeMCU Weather Report</h1>\n";
  
  ptr +="<p>Temperature: ";
  ptr +=(int)Temperaturestat;
  ptr +="°C</p>";
  ptr +="<p>Humidity: ";
  ptr +=(int)Humiditystat;
  ptr +="%</p>";
  
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

Mam jednak kilka uwag i pytań.
Podczas podgrywania programu (lub resetu/wyłączenia zasilania) moduł dht musi być odłączony od układu ESP. W innym wypadku program się nie podegra (w przypadku resetu nie wystartują pomiary). Dodałem w kodzie, zasilanie układu dht, po kilku sekundach od podegrania/resetu, dzięki temu moduł DHT działa prawidłowo. Pytanie brzmi dlaczego tak się dzieje?
Czy jest to jakiś konflikt na magistrali 1-wire?? Wyczytałem że dht korzysta z takiej właśnie (zmodyfikowanej) magistrali. Jeśli to jest ta przyczyna to może ktoś zna szczegóły? Jeśli to coś innego to co? 🙂

Kolejna moja zagwozdka to czy jest możliwość podgarnia programu a dopiero później zadeklarować nazwę sieci i hasło? Myślałem wstępnie o wpisywaniu tego przez konsolę szeregową ale czy jest to możliwe? A jeśli tak to zapisy do zmiennej a następnie reset całego układu i to wszystko wywołane z konsoli szeregowej?
Ponieważ trochę się już nad tym zastanawiam proszę o jakąś podpowiedź. 🙂

Pozdrawiam.

 

 

 

Link do komentarza
Share on other sites

(edytowany)

Odświeżając trochę pytanie, czy ma ktoś pomysł dlaczego jest taki problem z magistralą 1-wire?

Kolejne pytanie jakie mi się pojawiło.
Konfigurując układ w sieci wi-fi postawionej na telefonie wszystko działa tak jak należy. Oznacza to że łącze się po wi-fi, układ dostaje adres ip i po tym adresie łącze się z utworzonym serwerem i wszystko działa.
Konfigurując wszystko tak sam dla sieci Wi-fi w mieszkaniu dostaję jakiś adres ip ale nie mogę się z nim połączyć.

Niestety nie mam dostępu do routera ponieważ dostawca internetu tego nie udostępnił.
Moje pytanie brzmi czy w routerze może być coś wyłączone lub jakaś opcja odłączona która coś mi blokuje i nie mogę połączyć się z utworzonym serwerem?

Pozdrawiam i mam nadzieję że ktoś może zna rozwiązanie takiego problemu 🙂
 

Edytowano przez Leonarsen
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

Jeżeli laptop, telefon i esp pracują w tej samej sieci to raczej routerowi nic do połączenia - on pracuje jak Access Point w obrębie tej sieci. Możesz sprawdzić czy np. działa ping - powinien. Podaj dokładne parametry adresacji swojego esp i laptopa (adres i maska). Śmiało możesz podać - pula 10.0.0.0 - 10.255.255.255 to adresy prywatne, z którymi nikt na świecie nie połączy się z internetu. Też używam takiej adresacji - moje esp to 10.0.0.50, a laptop 10.0.0.2 (pracuję w sieci z maską 255.255.255.0) i działa ... bo musi.

Link do komentarza
Share on other sites

Trochę się pogubiłem.
Sprawdziłem dokładnie i tak:
- telefon ma adres 10.1.24.204
- esp ma adres 10.1.43.46
- laptop ma adres 10.1.24.44 (maska 255.255.248.0)

teraz faktycznie widzę że esp dostało adres z innej puli.
Dlaczego tak się stało tylko w sieci wi-fi w mieszkaniu? A w sieci hot-spot z telefonu wszystkie adresy przydzielają się automatycznie z tej samej podsieci?
Dodatkowo, ja korzystam ze standardowej biblioteki espwifi i tam nie mogę (chyba) nadać swojemu esp adresu tylko pytam router o wolny adres i taki zostaje mi przydzielony. Czy można to zrobić jakoś inaczej? Ale jest to dodatkowa sprawa do rozwiązania później. 🙂

Link do komentarza
Share on other sites

Więc sam widzisz, że esp pracuje w innej sieci (zobacz) i dlatego nie możesz się z nim połączyć. Pytanie skąd wzięło ten adres? Czy połączyło się z odpowiednią siecią - raczej nie bo dostałoby adres z puli 10.1.24.1 - 10.1.31.254

Adres IP możesz ustawić statycznie - rezygnując z DHCP. Tutoriali jest wiele np. tu - zobacz

Edytowano przez Belferek
Link do komentarza
Share on other sites

Sprawdziłem kilka rzeczy. Po ustawieniu statycznego IP nadal zostaje mi przydzielony 10.1.43.46. Robię to dobrze bo na innym routerze działa tak jak ustawiłem. Szukam dalej przyczyny. Dziś sprawdziłem że urządzenie które dostałem od dostawcy to tak naprawdę modem z opcją wi-fi (chyba jest to Cisco epc3008 odtwarzam z pamięci bo nie mam tego przed sobą). Zastanawiam się nadal czy urządzenie może być przyczyną tego kłopotu. Biorąc pod uwagę brak dostępu do tego klamota, chyba kupię jakiś router, podłącz za tym modemem i zrobię swoją sieć... 😛

Link do komentarza
Share on other sites

Używałem kodu ze strony:

https://circuits4you.com/2018/03/09/esp8266-static-ip-address-arduino-example/

oczywiście wpisałem swoje parametry.

/*
 * ESP8266 NodeMCU LED Control over WiFi Demo
 * Using Static IP Address for ESP8266
 * https://circuits4you.com
 */
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

//ESP Web Server Library to host a web page
#include <ESP8266WebServer.h>

//---------------------------------------------------------------
//Our HTML webpage contents in program memory
const char MAIN_page[] PROGMEM = R"=====(
  <!DOCTYPE html>
  <html>
  <body>
  <center>
  <h1>WiFi LED on off demo: 1</h1><br>
  Ciclk to turn <a href="ledOn">LED ON</a><br>
  Ciclk to turn <a href="ledOff">LED OFF</a><br>
  <hr>
  <a href="https://circuits4you.com">circuits4you.com</a>
  </center>
  
  </body>
  </html>
)=====";
//---------------------------------------------------------------


//Static IP address configuration
IPAddress staticIP(192, 168, 43, 90); //ESP static ip
IPAddress gateway(192, 168, 43, 1);   //IP Address of your WiFi Router (Gateway)
IPAddress subnet(255, 255, 255, 0);  //Subnet mask
IPAddress dns(8, 8, 8, 8);  //DNS


const char* deviceName = "circuits4you.com";

//On board LED Connected to GPIO2
#define LED 2  

//SSID and Password of your WiFi router
const char* ssid = "yourWiFissid";
const char* password = "yourWiFipassword";

//Declare a global object variable from the ESP8266WebServer class.
ESP8266WebServer server(80); //Server on port 80

//===============================================================
// This routine is executed when you open its IP in browser
//===============================================================
void handleRoot() {
 Serial.println("You called root page");
 String s = MAIN_page; //Read HTML contents
 server.send(200, "text/html", s); //Send web page
}

void handleLEDon() { 
 Serial.println("LED on page");
 digitalWrite(LED,LOW); //LED is connected in reverse
 server.send(200, "text/html", "LED is ON"); //Send ADC value only to client ajax request
}

void handleLEDoff() { 
 Serial.println("LED off page");
 digitalWrite(LED,HIGH); //LED off
 server.send(200, "text/html", "LED is OFF"); //Send ADC value only to client ajax request
}
//==============================================================
//                  SETUP
//==============================================================
void setup(void){
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);     //Connect to your WiFi router
  Serial.println("");

  //Onboard LED port Direction output
  pinMode(LED,OUTPUT); 
  //Power on LED state off
  digitalWrite(LED,HIGH);

  WiFi.disconnect();  //Prevent connecting to wifi based on previous configuration
  
  WiFi.hostname(deviceName);      // DHCP Hostname (useful for finding device for static lease)
  WiFi.config(staticIP, subnet, gateway, dns);
  WiFi.begin(ssid, password);

  WiFi.mode(WIFI_STA); //WiFi mode station (connect to wifi router only
  
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  //If connection successful show IP address in serial monitor
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP
 
  server.on("/", handleRoot);      //Which routine to handle at root location. This is display page
  server.on("/ledOn", handleLEDon); //as Per  <a href="ledOn">, Subroutine to be called
  server.on("/ledOff", handleLEDoff);

  server.begin();                  //Start server
  Serial.println("HTTP server started");
}
//==============================================================
//                     LOOP
//==============================================================
void loop(void){
  server.handleClient();          //Handle client requests
}

 

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.