lcd esp8266 timer

ciao ragazzi, vorrei stampare a display temperatura, umidita e luce. c’è però un problema, i caricamenti con esp8266 nel mio sito li fa ogni 1 ora circa, come posso aggiornare il display ogni 5secondi stampando temperatura, umidita, ecc…?

ecco lo sketch

#include "DHT.h"
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#define SSID "Hipkk118"
#define PASS "gbv8812"
#define SERVER "www.mrvista.org"
String path_page = "/insei.php";
SoftwareSerial mySerial(9, 10);
#define DHTPIN 2 //Pin per rilevare la temperatura
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); //Creo istanza temperatura del tipo DHTTYPE
int buzzer = 13;
LiquidCrystal lcd(7, 8, 3, 5, 11, 12);

int count;
char status_p;
String cosaMandare;
double T, P, p0, a;
String temp_title = "t=";
String umid_title = "u=";
String lux_title = "l=";
String temp, umid, lux; //Dati da inviare con il Wifi
int inLux = A2; //Pin per rilevare la luce
String response, response2;
int m=0;
int s=0;

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  mySerial.begin(115200); //Solo per debug
  delay(3000);
  pinMode(buzzer,OUTPUT);
  lcd.print("Start...");
  Serial.println("Start...");
}

void loop() {
  tone(buzzer,2000,500);
  int i=1;

  sendData("AT+RST\r\n", 3000); //Resetta modulo
  sendData("AT+GMR\r\n", 3000); //Ottieni info
  //sendData("AT+CWLAP\r\n", 3000); //Momentaneamente tolto
  sendData("AT+CWMODE=1\r\n", 1000);

  String cmd = "AT+CWJAP=\"";
  cmd += SSID;
  cmd += "\",\"";
  cmd += PASS;
  cmd += "\"\r\n";

  sendData(cmd, 7000);
  sendData("AT+CIFSR\r\n", 5000);
       lcd.clear();
       lcd.write("Connessione ok");
       delay(2000);
       lcd.clear();
  //Rilevazione temperatura e umidità
  float temperatura; /*Temperatura che verrà inviata (scelgo la media tra i due valori misurati
                    DHT22 e BMP180)*/
  delay(3000); //Attenzione: per il DHT22 frequenza di campionamento non superiore a 0,5 Hz (una volta ogni 2 secondi)
  int temp_dht22 = (int)dht.readTemperature(); //Leggo il valore della temperatura in gradi C dall'istanza dht
  delay(3000);
  int umi_dht22 = (int)dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht
  delay(3000);
  lcd.write("Temperatura "+temp_dht22);
  lcd.setCursor(0,1);
  lcd.write("Umidità "+umi_dht22);
  
  delay(2000);
  int lux_value = analogRead(inLux); //Leggi valore di luce in una scala da 0 a 1023
  int lux_perc = map(lux_value, 1023, 0, 0, 100); //percentuale
  /*Serial.print("Luminosita': ");
    Serial.print(lux_perc);
    Serial.println("%");
  */
  delay(2000);

  temp = temp_title + (int)temp_dht22;
  umid = umid_title + (int)umi_dht22;
  lux = lux_title + lux_perc;
   cosaMandare=temp;
  cosaMandare+="&";
  cosaMandare+=umid;
  cosaMandare+="&";
  cosaMandare+=lux;

  String cmd55 = "AT+CIPSTART=\"TCP\",\"";
  cmd55 += SERVER;
  cmd55 += "\",80\r\n";

  sendData(cmd55, 2000); //Avvia connessione con server

  String cmd2 = "GET ";
  cmd2 += path_page;
  cmd2 += "?";
  cmd2 += cosaMandare;
  cmd2 += " HTTP/1.1\r\nHost: ";
  cmd2 += SERVER;
  cmd2 += "\r\n\r\n";

  String cmd3 = "AT+CIPSEND=";
  cmd3 += cmd2.length();
  cmd3 += "\r\n";
  sendData(cmd3, 2000);//Lunghezza della richiesta
  //delay(1000);
  sendData(cmd2, 3000); //Richiesta
  tone(buzzer,2000,200);
  delay(500);
  tone(buzzer,2000,200);
  while(i<120){
  delay(29884); //ritardo 59,27min
  i++;
  }
  //delay(120000); //ritardo 2min
  lcd.clear();
}

String sendData(String command, const int timeout)
{
  response = "";
  response2 = "";
  count = 0;
  mySerial.print(command); // invia il comando all' esp8266
  long int time = millis();
  while ((time + timeout) > millis())
  {
    while (mySerial.available())
    {
      char c = mySerial.read(); // componi la risposta coi caratteri ricevuti dal modulo
      if (c == '\n' or c == '\r')
        response2 += ' ';
      else
        response2 += c;
      response += c;

      count++;
    }
  }
  
    Serial.print(response);
    Serial.print(count);
  
  return response;
}
while(i<120){
  delay(29884); //ritardo 59,27min
  i++;
  }

forse non ottieni ogni 5 secondi ma ogni 15 secondi con i delay che si sono.
Ciao Uwe

Devo visualizzare ogni 15 secondi quindi? avresti una soluzione? grazie

:o Uwe nn l'ho capita.....

Comunque potresti con la funzione millis() + una variabile temporanea andare a richiamare la routine di lettura ogni 5 secondi e stamparla sul display. A differenza del delay però il loop continua a girare. Quando sei nella routine di lettura, leggi i dati, incrementi un contatore (che conta da 0 a 2 e si resetta). Quando è 0 stampa temperatura, 1 umidità e 2 lux. Ogni 5 secondi avrai visualizzato un parametro rolling Con un secondo contatore sempre nella routine alla 720 (720*5=3600.... 1 ora) esima volta chiama la funzione che invia i dati al server e si azzera. Forse mi sono spiegato ?

Stefano

No, non ho mai utilizzato il millis in termine di codice potresti farmi alcuni esempi? o applicare direttamente nel codice che ho messo nel primo post. grazie

Per imparare ad usare millis() ... leggi prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro ;)

Guglielmo

Ho fatto come mi avete detto voi, però non mi stampa temperatura e umidita…

Ecco il codice

#include "DHT.h" //libreria sensore DHT temperatura e umidita
#include <SoftwareSerial.h> //libreria modulo wifi esp8266
#include <LiquidCrystal.h>  //libreria display
#define SSID "Hipercom1067118" //nome wifi
#define PASS "gbveeu308812" //password wifi
#define SERVER "www.m3.altervista.org" //mio sito 
String path_page = "/inserisci.php"; //pagina php che cattura i dati mandati da arduino
SoftwareSerial mySerial(9, 10); //inizializza l' esp8266 specificando dove è connesso (RX|TX)
#define DHTPIN 2 //Pin per rilevare la temperatura
#define DHTTYPE DHT22 //tipo di dht, esiste anche il DHT11  
DHT dht(DHTPIN, DHTTYPE); //Creo istanza temperatura del tipo DHTTYPE
int buzzer = 4; //pin buzzer
LiquidCrystal lcd(7, 8, 3, 5, 11, 12); 

int count;
unsigned long previousMillis1 = 0; //will store last time LED was updated
unsigned long interval1 = 5000; //interval at which to blink (milliseconds)
unsigned long previousMillis2 = 0; //will store last time LED was updated
char status_p;
String cosaMandare; //quello che viene effettivamente mandato alla pagina php
double T, P, p0, a;
String temp_title = "t=";
String umid_title = "u=";
String lux_title = "l=";
String temp, umid, lux; //Dati da inviare con il Wifi
int inLux = A2; //Pin per rilevare la luce
String response, response2;
int m=0;
int s=0;

void setup() {
  lcd.begin(16, 2); //pixel display
  Serial.begin(9600); 
  mySerial.begin(115200); 
  delay(3000);
  pinMode(buzzer,OUTPUT);
  lcd.print("Start...");
  Serial.println("Start...");
}

void loop() {
  unsigned long currentMillis = millis();
  tone(buzzer,2000,500);
  int i=1;

  sendData("AT+RST\r\n", 3000); //Resetta modulo
  sendData("AT+GMR\r\n", 3000); //Ottieni info
  //sendData("AT+CWLAP\r\n", 3000); //Momentaneamente tolto
  sendData("AT+CWMODE=1\r\n", 1000);

  String cmd = "AT+CWJAP=\"";
  cmd += SSID;
  cmd += "\",\"";
  cmd += PASS;
  cmd += "\"\r\n";

  sendData(cmd, 7000);
  sendData("AT+CIFSR\r\n", 5000);
       lcd.clear();
       lcd.write("Connessione ok");
       delay(2000);
       lcd.clear();
  //Rilevazione temperatura e umidità
  float temperatura; /*Temperatura che verrà inviata (scelgo la media tra i due valori misurati
                    DHT22 e BMP180)*/
  delay(3000); //Attenzione: per il DHT22 frequenza di campionamento non superiore a 0,5 Hz (una volta ogni 2 secondi)
  int temp_dht22 = (int)dht.readTemperature(); //Leggo il valore della temperatura in gradi C dall'istanza dht
  delay(3000);
  int umi_dht22 = (int)dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht
  delay(3000);
  if(currentMillis - previousMillis1 > interval1){
    previousMillis1=currentMillis;
lcd.write("Temperatura "+temp_dht22);
  lcd.setCursor(0,1);
  lcd.write("Umidità "+umi_dht22);
  }
  delay(2000);
  int lux_value = analogRead(inLux); //Leggi valore di luce in una scala da 0 a 1023
  int lux_perc = map(lux_value, 1023, 0, 0, 100); //percentuale
  /*Serial.print("Luminosita': ");
    Serial.print(lux_perc);
    Serial.println("%");
  */
  delay(2000);
if(currentMillis - previousMillis2 > (720*interval1)){
    previousMillis2=currentMillis;
  temp = temp_title + (int)temp_dht22;
  umid = umid_title + (int)umi_dht22;
  lux = lux_title + lux_perc;
   cosaMandare=temp;
  cosaMandare+="&";
  cosaMandare+=umid;
  cosaMandare+="&";
  cosaMandare+=lux;

  String cmd55 = "AT+CIPSTART=\"TCP\",\"";
  cmd55 += SERVER;
  cmd55 += "\",80\r\n";

  sendData(cmd55, 2000); //Avvia connessione con server

  String cmd2 = "GET ";
  cmd2 += path_page;
  cmd2 += "?";
  cmd2 += cosaMandare;
  cmd2 += " HTTP/1.1\r\nHost: ";
  cmd2 += SERVER;
  cmd2 += "\r\n\r\n";

  String cmd3 = "AT+CIPSEND=";
  cmd3 += cmd2.length();
  cmd3 += "\r\n";
  sendData(cmd3, 2000);//Lunghezza della richiesta
  //delay(1000);
  sendData(cmd2, 3000); //Richiesta
  tone(buzzer,2000,200);
  delay(500);
  tone(buzzer,2000,200);
}
  //delay(120000); //ritardo 2min
  lcd.clear();
}

String sendData(String command, const int timeout)
{
  response = "";
  response2 = "";
  count = 0;
  mySerial.print(command); // invia il comando all' esp8266
  long int time = millis();
  while ((time + timeout) > millis())
  {
    while (mySerial.available())
    {
      char c = mySerial.read(); // componi la risposta coi caratteri ricevuti dal modulo
      if (c == '\n' or c == '\r')
        response2 += ' ';
      else
        response2 += c;
      response += c;

      count++;
    }
  }
  
    Serial.print(response);
    Serial.print(count);
  
  return response;
}

ecco il video: Vidme

poi, invece, sostituisco :

lcd.write("Temperatura "+temp_dht22);
 lcd.setCursor(0,1);
 lcd.write("Umidità "+umi_dht22);

con :
lcd.write(“ciao”);

e mi scrive ma non rispettando il tempo, video: Vidme

Ciao, hai fatto "quasi" come detto: c'è una discreta serie di delay, 15,5 secondi ogni giro di loop... a riga 42 metti unsigned long currentMillis = millis(); con tutti quei delay a riga 71 quando utilizzi la variabile è già "vecchia" di 11 secondi... non va bene.

Il consiglio che ti posso dare è fare un nuovo programma aggiungendo pezzo per pezzo il codice che in parte va. 1) fai lampeggiare un led ogni 5 secondi [u]con il millis[/u] 2) mentre il led lampeggia aggiungi [u]1[/u] lettura e la invii su seriale Poi gli aggiungi la stampa a video e per ultimo l'invio a remoto. Il led dovrà sempre lampeggiare uguale. Ti metti comodo, una birra (rigorosamente analcolica ;) ) e cerca di non copiare troppo.... un pezzettino per volta e risolvi...

Stefano

cam9500:
Ciao, hai fatto “quasi” come detto: c’è una discreta serie di delay, 15,5 secondi ogni giro di loop…
a riga 42 metti unsigned long currentMillis = millis();
con tutti quei delay a riga 71 quando utilizzi la variabile è già “vecchia” di 11 secondi… non va bene.

Il consiglio che ti posso dare è fare un nuovo programma aggiungendo pezzo per pezzo il codice che in parte va.

  1. fai lampeggiare un led ogni 5 secondi con il millis
  2. mentre il led lampeggia aggiungi 1 lettura e la invii su seriale
    Poi gli aggiungi la stampa a video e per ultimo l’invio a remoto.
    Il led dovrà sempre lampeggiare uguale.
    Ti metti comodo, una birra (rigorosamente analcolica :wink: ) e cerca di non copiare troppo… un pezzettino per volta e risolvi…

Stefano

Eh… trovami una birra analcolica :cold_sweat:

Comunque ho modificato così lo sketch

#include "DHT.h" //libreria sensore DHT temperatura e umidita
#include <SoftwareSerial.h> //libreria modulo wifi esp8266
#include <LiquidCrystal.h>  //libreria display
#define SSID "Hipercom1067118" //nome wifi
#define PASS "gbveeu308812" //password wifi
#define SERVER "www.m3.altervista.org" //mio sito 
String path_page = "/inserisci.php"; //pagina php che cattura i dati mandati da arduino
SoftwareSerial mySerial(9, 10); //inizializza l' esp8266 specificando dove è connesso (RX|TX)
#define DHTPIN 2 //Pin per rilevare la temperatura
#define DHTTYPE DHT22 //tipo di dht, esiste anche il DHT11  
DHT dht(DHTPIN, DHTTYPE); //Creo istanza temperatura del tipo DHTTYPE
int buzzer = 4; //pin buzzer
LiquidCrystal lcd(7, 8, 3, 5, 11, 12); 

int count;
unsigned long previousMillis1 = 0; //will store last time LED was updated
unsigned long interval1 = 1000; //interval at which to blink (milliseconds)
unsigned long previousMillis2 = 0; //will store last time LED was updated
char status_p;
String cosaMandare; //quello che viene effettivamente mandato alla pagina php
double T, P, p0, a;
String temp_title = "t=";
String umid_title = "u=";
String lux_title = "l=";
String temp, umid, lux; //Dati da inviare con il Wifi
int inLux = A2; //Pin per rilevare la luce
String response, response2;
int m=0;
int s=0;
unsigned long currentMillis;
void setup() {
  unsigned long currentMillis = millis();
  lcd.begin(16, 2); //pixel display
  Serial.begin(9600); 
  mySerial.begin(115200); 
  pinMode(buzzer,OUTPUT);
}

void loop() {
    lcd.clear();
  lcd.print("Start...");
  Serial.println("Start...");
  tone(buzzer,2000,500);
  int i=1;

  sendData("AT+RST\r\n", 1000); //Resetta modulo
  sendData("AT+GMR\r\n", 1000); //Ottieni info
  //sendData("AT+CWLAP\r\n", 3000); //Momentaneamente tolto
  sendData("AT+CWMODE=1\r\n", 1000);

  String cmd = "AT+CWJAP=\"";
  cmd += SSID;
  cmd += "\",\"";
  cmd += PASS;
  cmd += "\"\r\n";

  sendData(cmd, 1000);
  sendData("AT+CIFSR\r\n", 1000);
       lcd.clear();
       lcd.write("Connessione ok");
       delay(1000);
       lcd.clear();
  //Rilevazione temperatura e umidità
  float temperatura; /*Temperatura che verrà inviata (scelgo la media tra i due valori misurati
                    DHT22 e BMP180)*/
  int temp_dht22 = (int)dht.readTemperature(); //Leggo il valore della temperatura in gradi C dall'istanza dht
  delay(2500);
  int umi_dht22 = (int)dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht
  lcd.write("prima");
  delay(1000);
  lcd.clear();
  if(currentMillis - previousMillis1 > interval1){
    previousMillis1=currentMillis;
    lcd.write("ok");
  /*lcd.write("Temperatura "+temp_dht22);
  lcd.setCursor(0,1);
  lcd.write("Umidità "+umi_dht22);*/
  delay(1000);
  }
  lcd.write("dopo");
  delay(1000);
  lcd.clear();
  int lux_value = analogRead(inLux); //Leggi valore di luce in una scala da 0 a 1023
  int lux_perc = map(lux_value, 1023, 0, 0, 100); //percentuale
  /*Serial.print("Luminosita': ");
    Serial.print(lux_perc);
    Serial.println("%");
  */
if(currentMillis - previousMillis2 > (720*interval1)){
    previousMillis2=currentMillis;
  temp = temp_title + (int)temp_dht22;
  umid = umid_title + (int)umi_dht22;
  lux = lux_title + lux_perc;
   cosaMandare=temp;
  cosaMandare+="&";
  cosaMandare+=umid;
  cosaMandare+="&";
  cosaMandare+=lux;

  String cmd55 = "AT+CIPSTART=\"TCP\",\"";
  cmd55 += SERVER;
  cmd55 += "\",80\r\n";

  sendData(cmd55, 1000); //Avvia connessione con server

  String cmd2 = "GET ";
  cmd2 += path_page;
  cmd2 += "?";
  cmd2 += cosaMandare;
  cmd2 += " HTTP/1.1\r\nHost: ";
  cmd2 += SERVER;
  cmd2 += "\r\n\r\n";

  String cmd3 = "AT+CIPSEND=";
  cmd3 += cmd2.length();
  cmd3 += "\r\n";
  sendData(cmd3, 1000);//Lunghezza della richiesta
  //delay(1000);
  sendData(cmd2, 1000); //Richiesta
  tone(buzzer,2000,200);
  delay(500);
  tone(buzzer,2000,200);
}//parentesi if
}

String sendData(String command, const int timeout)
{
  response = "";
  response2 = "";
  count = 0;
  mySerial.print(command); // invia il comando all' esp8266
  long int time = millis();
  while ((time + timeout) > millis())
  {
    while (mySerial.available())
    {
      char c = mySerial.read(); // componi la risposta coi caratteri ricevuti dal modulo
      if (c == '\n' or c == '\r')
        response2 += ' ';
      else
        response2 += c;
      response += c;

      count++;
    }
  }
  
    Serial.print(response);
    Serial.print(count);
  
  return response;
}

ho accorciato i tempi ma non mi vuole proprio stampare sti valori sul display…

https://vid.me/lGZh

Ciao, scusami ma insisto: parti da un codice più semplice per poi espanderlo altrimenti non riesci a capire bene cosa stai facendo. Nel dettaglio con il codice che hai postato hai tolto le righe di stampa di umidità e temperatura... per questo non le vedi ;) Le funzioni di invio dati, di lettura temperature devo attivarsi solo quando ne hai bisogno: ogni 5 secondi la lettura delle temperature ed ogni 3600 secondi l'invio dati. Finchè le tieni nel loop verranno richiamate ad ogni giro.

Comunque se provi a sostituire il

lcd.write("prima");

con

    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.write("Temperatura ");
    lcd.setCursor(12,1);
    lcd.print(temp_dht22);
    lcd.setCursor(0,1); 
    lcd.write("Umidita' ");
    lcd.setCursor(12,1);
    lcd.print(umi_dht22);

dovresti vederle. Stefano

cam9500:
Ciao

piano piano con i vostri consigli sono riuscito a farlo funzionare. adesso aggiungo bmp180 (che settimane fa si era bruciato) e devo inviare il tutto al server però, se utilizzo librerie wire e sfe_bmp180 non mi funziona… ovvero non mi manda nulla al server…
quando commento/tolgo ste librerie e suoi attributi mi funziona… mi sapete dire il perchè? vi scrivo lo sketch che mi funziona però mando un valore che decido io (p=2222):

#include "DHT.h" //libreria sensore DHT temperatura e umidita
#include <SoftwareSerial.h> //libreria modulo wifi esp8266
#include <LiquidCrystal.h>  //libreria display
/*#include <Wire.h>
#include <SFE_BMP180.h>*/
#define SSID "Hipercom1067118"
#define PASS "gbveeu308812"

#define SERVER "www.m3.altervista.org" //mio sito 
String path_page = "/inserisci.php"; //pagina php che cattura i dati mandati da arduino
SoftwareSerial mySerial(9, 10); //inizializza l' esp8266 specificando dove è connesso (RX|TX)
#define DHTPIN 2 //Pin per rilevare la temperatura
#define DHTTYPE DHT22 //tipo di dht, esiste anche il DHT11  
DHT dht(DHTPIN, DHTTYPE); //Creo istanza temperatura del tipo DHTTYPE
//SFE_BMP180 pressure;
int buzzer = 4; //pin buzzer
LiquidCrystal lcd(7, 8, 3, 5, 11, 12); 

int count;
unsigned long previousMillis1 = 0; //will store last time LED was updated
unsigned long interval1 = 1000; //interval at which to blink (milliseconds)
unsigned long previousMillis2 = 0; //will store last time LED was updated
String cosaMandare; //quello che viene effettivamente mandato alla pagina php
double T, P;
char status_p;
String temp_title = "t=";
String umid_title = "u=";
String press_title = "p=";
String lux_title = "l=";
String temp, umid, pressi, lux; //Dati da inviare con il Wifi
int inLux = A2; //Pin per rilevare la luce
String response, response2;
int y=0;
unsigned long currentMillis;
void setup() {
 lcd.begin(16, 2); //pixel display
  Serial.begin(9600); 
  mySerial.begin(115200); 
  pinMode(buzzer,OUTPUT);
    lcd.print("Start...");
  Serial.println("Start...");
}

void loop() {
    unsigned long currentMillis = millis();
    if(y==0)
    {
      tone(buzzer,2000,500);
      y=2;
      delay(2000);
    }
  

  if(currentMillis - previousMillis1 > interval1){
    previousMillis1=currentMillis;
  //Rilevazione temperatura e umidità
  int temp_dht22 = (int)dht.readTemperature(); //Leggo il valore della temperatura in gradi C dall'istanza dht
  delay(2500);
  int umi_dht22 = (int)dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.write("Temperatura: ");
  lcd.setCursor(12,0);
  lcd.print(temp_dht22);
  lcd.setCursor(14,0);
  lcd.write("*C");
  lcd.setCursor(0,1);
  lcd.write("Umidita: ");
  lcd.setCursor(9,1);
  lcd.print(umi_dht22);
  lcd.setCursor(11,1);
  lcd.write("%");
  }
if(currentMillis - previousMillis2 > (2*interval1)){ //712
    previousMillis2=currentMillis;
    
  sendData("AT+RST\r\n", 3000); //Resetta modulo
  sendData("AT+GMR\r\n", 3000); //Ottieni info
  sendData("AT+CWMODE=1\r\n", 1000);

  String cmd = "AT+CWJAP=\"";
  cmd += SSID;
  cmd += "\",\"";
  cmd += PASS;
  cmd += "\"\r\n";

  sendData(cmd, 7000);
  sendData("AT+CIFSR\r\n", 5000);
  int lux_value = analogRead(inLux); //Leggi valore di luce in una scala da 0 a 1023
  int lux_perc = map(lux_value, 1023, 0, 0, 100); //percentuale
     /* if (pressure.begin()) {
        status_p = pressure.startPressure(3); //Inizia a misurare la pressione con sensore BMP180
        if (status_p != 0)
        {
          // Wait for the measurement to complete:
          delay(status_p);
          status_p = pressure.getPressure(P, T);
      }}
  */
  int temp_dht22 = (int)dht.readTemperature(); //Leggo il valore della temperatura in gradi C dall'istanza dht
  delay(2500);
  int umi_dht22 = (int)dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht
  temp = temp_title + (int)temp_dht22;
  umid = umid_title + (int)umi_dht22;
 // pressi = press_title + (int)P;
  lux = lux_title + lux_perc;
   cosaMandare=temp;
  cosaMandare+="&";
  cosaMandare+=umid;
  cosaMandare+="&p=2222";
  //cosaMandare+=pressi;
  cosaMandare+="&";
  cosaMandare+=lux;
Serial.println("deve mandare:"+cosaMandare);
  String cmd55 = "AT+CIPSTART=\"TCP\",\"";
  cmd55 += SERVER;
  cmd55 += "\",80\r\n";

  sendData(cmd55, 2000); //Avvia connessione con server

  String cmd2 = "GET ";
  cmd2 += path_page;
  cmd2 += "?";
  cmd2 += cosaMandare;
  cmd2 += " HTTP/1.1\r\nHost: ";
  cmd2 += SERVER;
  cmd2 += "\r\n\r\n";

  String cmd3 = "AT+CIPSEND=";
  cmd3 += cmd2.length();
  cmd3 += "\r\n";
  sendData(cmd3, 2000);//Lunghezza della richiesta
  //delay(1000);
  sendData(cmd2, 3000); //Richiesta
  tone(buzzer,2000,200);
  delay(500);
  tone(buzzer,2000,200);
}//parentesi if
}

String sendData(String command, const int timeout)
{
  response = "";
  response2 = "";
  count = 0;
  mySerial.print(command); // invia il comando all' esp8266
  long int time = millis();
  while ((time + timeout) > millis())
  {
    while (mySerial.available())
    {
      char c = mySerial.read(); // componi la risposta coi caratteri ricevuti dal modulo
      if (c == '\n' or c == '\r')
        response2 += ' ';
      else
        response2 += c;
      response += c;

      count++;
    }
  }
  
    Serial.print(response);
    Serial.print(count);
  
  return response;
}

fatemi sapere.

Ciao, intanto un paio di migliorie: le variabili che usi temp_dht22,umi_dht22 dichiarale sopra il setup e non nel loop cossì dopo che hai fatto la lettura intorno alla riga 58

    temp_dht22 = dht.readTemperature(); //Leggo il valore della temperatura in gradi C dall'istanza dht
    delay(2500);
   umi_dht22 = dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht

riutilizzi i valori per l'invio e non metti più

    int temp_dht22 = (int)dht.readTemperature(); //Leggo il valore della temperatura in gradi C dall'istanza dht
    delay(2500);
    int umi_dht22 = (int)dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht

tanto in 2 secondi non credo cambino molto ;)

Poi per i dati:

cosaMandare += "&p=2222";

stai sommando un numero ad una stringa, verifica che non dia problemi (non saprei bene cosa dirti)..... Stefano

cam9500: Poi per i dati:

cosaMandare += "&p=2222";

stai sommando un numero ad una stringa, verifica che non dia problemi (non saprei bene cosa dirti).....

... poi non andare scrive in giro che l'"entità" Gpb01 ti "cazzia" in continuazione, ma ....

cosaMandare è un oggetto di tipo String e l'operatore += su di esso non fa altro che accodargli la stringa "&p2222" (... che NON è un numero). :smiling_imp:

Guglielmo

@uscrocc: … sappi che prima o poi, con quel programma, potrai avere incomprensibili problemi ed errori … ::slight_smile:

Ricordati che … NON sei su un PC dove c’è un sistema operativo ed un “garbage collector”, sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe “String”, a causa dell’allocazione e riallocazione dinamica della memoria, porta quasi sempre … a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Impara ad usare le stringhe classiche del C … ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovai nella libreria standard (… che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h> :wink:

Vedrai che avrai programmi più veloci e che, una volta collaudati, gireranno per sempre senza darti problemi !

Guglielmo

Spe, che mi sono spiegato male:

cosaMandare += "&p=2222";

mi riferivo prima di sostituire con il &p=2222(che ha confermato funzionare) Difatti faceva così (un estratto con le dichiarazioni):

String cosaMandare;
String umid_title = "u=";
String  umid;
int umi_dht22 = (int)dht.readHumidity(); //Leggo il valore dell'umidità dall'istanza dht
 umid = umid_title + (int)umi_dht22;
 cosaMandare+=umid;

quindi somma int a string: dovrebbe perlomeno fare umid = umid_title + String(umid) Purtroppo non avendo mai avuto occasione di fare questo casting gli ho detto di verificarlo senza dargli la risposta esatta. Adesso aggiungo anche il link per verifica

Stefano

cam9500: quindi somma int a string: dovrebbe perlomeno fare umid = umid_title + String(umid)

Ste' ... ... mica ti seguo (... specie se poi continui a mettere codice con quella schifezza di codici colore !) ::)

Sia umid che umid_title sono dichiarati String ... ... casomai la cosa da verificare è umid = umid_title + (int)umi_dht22; dove effettivamente somma ad uno String un intero ...

Probabilmente, se lo fa ed il compilatore NON si incavola, si potrà fare ... non te lo so dire ... ... sai bene che NON uso String :stuck_out_tongue_closed_eyes:

Guglielmo

Scusa-te, mi rendo conto che a volte faccio confusione a spiegarmi: avevo visto il problema del casting ([STRING]+[INT])e mi sono spiegato male.

Sia umid che umid_title sono dichiarati String …
… casomai la cosa da verificare è umid = umid_title + (int)umi_dht22; dove effettivamente somma ad uno String un intero …

Ecco esatto!

Ma porca miseria è il ctrlC-ctrlV che mi frega per i codici colore!

Il compilatore lo digerisce (altrimenti gli avrebbe dato un errore) ma sarebbe da analizzare l’ascii che parte verso il server.

cam9500: Il compilatore lo digerisce (altrimenti gli avrebbe dato un errore) ma sarebbe da analizzare l'ascii che parte verso il server.

Semplicemente trasforma in String quell'int prima di accodarlo ... appena verificato :D

Guglielmo

gpb01: Semplicemente trasforma in String quell'int prima di accodarlo ... appena verificato :D

Guglielmo

provo a cambiare da String a char ma mi dice errore a tutto: exit status 1 invalid conversion from 'const char*' to 'char' [-fpermissive]

Secondo me non è problema di char, String, ecc.. perchè non includendo le librerie wire e bmp180 mi funziona e me lo manda correttamente. Secondo me l'errore sta nelle librerie, infatti mi dice questo errore:

C:\Users\marco\Documents\Arduino\libraries\BMP180\BMP180.cpp: In member function 'uint8_t* BMP180::Read(int, int)':

C:\Users\marco\Documents\Arduino\libraries\BMP180\BMP180.cpp:252:11: warning: address of local variable 'buffer' returned [-Wreturn-local-addr]

   uint8_t buffer[length];

           ^

In file included from C:\Users\marco\Documents\Arduino\libraries\BMP180\BMP180.cpp:22:0:

C:\Users\marco\Documents\Arduino\libraries\BMP180\BMP180.cpp: In member function 'char* BMP180::GetErrorText(int)':

C:\Users\marco\Documents\Arduino\libraries\BMP180\BMP180.h:42:21: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

 #define ErrorCode_1 "Entered sample resolution was invalid. See datasheet for details."

                     ^

C:\Users\marco\Documents\Arduino\libraries\BMP180\BMP180.cpp:287:10: note: in expansion of macro 'ErrorCode_1'

   return ErrorCode_1;

          ^

C:\Users\marco\Documents\Arduino\libraries\BMP180\BMP180.cpp:289:9: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

  return "Error not defined.";

         ^

però alla fine lo compila e lo carica in arduino ma non manda al server