Buona sera ragazzi,
sono un principiante assoluto, quindi se ho fatto qualche errore grossolano mi scuso in anticipo, sono andato avanti dai ricordi del liceo di c++.
La mia idea sarebbe di usare il display Lcd 16x2 con arduino UNO per visualizzare dei dati di temperatura ed umidità, ricevuti dal sensore dht11, e di umidità del terreno ricevuti da un igrometro. In aggiunta a questo, avrei 3 Led, uno verde, uno rosso, uno giallo, che si accendono quando i valori sono in una determinata soglia.
Ho pensato di mettere 3 bottoni a pressione , ciascuno associato a una determinata misurazione, in modo tale da visualizzare uni parametro alla volta sull'lcd, e di conseguenza accendere il Led in base al valore di suddetto parametro.
Ho però riscontrato un problema che non riesco a risolvere:in qualche modo la misurazione del dht mi va in conflitto con il codice per i bottoni, quindi non funzionano, mentre il bottone associato all'igrometro, e quindi anche i led, sotto quelle condizioni vanno senza problemi.
Non credo sia un problema di montaggio, infatti separatamente i vari componenti vanno senza problemi, quindi chiederei consiglio a voi molto più esperti
ecco il codice
//includo librerie:
#include <LiquidCrystal.h>
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
//collegamenti ai pin:
int btemp = 5; //pin bottone temperatura
int bum = 4; //pin bottone umidità
int bumter = 3; //pin bottone umidità terreno
int pinSensore = A0;
int valoreOutput;
//led
const int ledV = 13; //segna se il valore è basso
const int ledR = 1; // segna se il valore è alto
const int ledG = 6; //segna se il valore è medio
// connessione display (pin)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
//sensore temperatura e umidità:
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
// righe per il sensore dht, prese direttamente dal tutorial di arduino sul dht11
static bool measure_environment( float *temperature, float *humidity )
{
static unsigned long measurement_timestamp = millis( );
/* Measure once every four seconds. */
if( millis( ) - measurement_timestamp > 3000ul )
{
if( dht_sensor.measure( temperature, humidity ) == true )
{
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
void setup()
{
float temperature;
float humidity;
lcd.begin(16, 2);
pinMode(btemp,INPUT_PULLUP);
pinMode(bum, INPUT_PULLUP);
pinMode(bumter, INPUT_PULLUP);
lcd.print("Menu");
//led
pinMode(ledV, OUTPUT );
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT );
}
void loop()
{
float temperature;
float humidity;
//bottone per temperatura
if (digitalRead(btemp) == LOW)
{
if( measure_environment( &temperature, &humidity ) == true ) //anche lei presa dal tutorial
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("temperatura");
lcd.setCursor(0,2);
lcd.print(temperature);
//accendo led per temperatura
if ( temperature<25 ){
digitalWrite(ledR, LOW);
digitalWrite(ledG, LOW);
digitalWrite(ledV, HIGH);
}
if ( temperature>25 ){
digitalWrite(ledR, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledG, HIGH);
}
if ( temperature>28 ){
digitalWrite(ledG, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledR, HIGH);
}
}
}
//bottone per umidità
if (digitalRead(bum) == LOW)
{
if( measure_environment( &temperature, &humidity ) == true )
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("umidita'");
lcd.setCursor(0,2);
lcd.print(humidity);
//accendo i led in base ai valori
if ( humidity<=70 ){
digitalWrite(ledR, LOW);
digitalWrite(ledG, LOW);
digitalWrite(ledV, HIGH);
}
if ( humidity>70 ){
digitalWrite(ledR, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledG, HIGH);
}
if ( humidity>90 ){
digitalWrite(ledG, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledR, HIGH);
}
}
}
//bottone per umidità terra
if (digitalRead(bumter) == LOW)
{
valoreOutput=analogRead(pinSensore);
valoreOutput=map(valoreOutput, 1023, 275, 0, 100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("umidita'terra");
lcd.setCursor(0,2);
lcd.print(valoreOutput);
lcd.print("%");
lcd.setCursor(0, 3);
//accendo i led in base ai valori
if ( valoreOutput<=70 ){
digitalWrite(ledR, LOW);
digitalWrite(ledG, LOW);
digitalWrite(ledV, HIGH);
}
if ( valoreOutput>70 ){
digitalWrite(ledR, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledG, HIGH);
}
if ( valoreOutput>90 ){
digitalWrite(ledG, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledR, HIGH);
}
}
}
il mio dubbio è, visto che l'igrometro va senza problemi, io abbia usato male queste righe di codice,
// righe per il sensore dht, prese direttamente dal tutorial di arduino sul dht11
static bool measure_environment( float *temperature, float *humidity )
{
static unsigned long measurement_timestamp = millis( );
/* Measure once every four seconds. */
if( millis( ) - measurement_timestamp > 3000ul )
{
if( dht_sensor.measure( temperature, humidity ) == true )
{
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
e di conseguenza questo if
if( measure_environment( &temperature, &humidity ) == true )
pPiù che altro queste righe nel tutorial sono spiegate come righe utili per vedere se si ha una nuova misurazione, e quindi nel caso positivo scriverla a display. Ho provato anche ad eliminarle, mandando direttamente in output le variabili temperature e humidity, ma con scarsi risultati.
Mi scuso per il post molto lungo, ma ho cercato di spiegare al meglio possibile la situazione.
Grazie in anticipo a chi mi potrà aiutare!!