Estou usando uma equação com os dados de um sensor de umidade e temperatura, porém observei que ao aplicar operações matemáticas utilizando os dados como variáveis, o sistema não utiliza as casas decimais e isso gera erros no resultado. Minha dúvida é: Como monto equações como esta na linguagem C++?
Por algum motivo os asteriscos não apareceram aqui, mas no programa está escrito conforme você falou: Serial.print(1.2110*((7.45event.temperature)/(234.7+event.temperature))(1-(0.01event.relative_humidity))+((0.21event.temperature)-2.3));*
O problema é que as casas decimais são ignoradas no cálculo da equação quando escrevo desta forma.
//----------------Inclui as bibliotecas do codigo----------------
#include <Adafruit_Sensor.h> // Inclui a biblioteca Adafruit_Sensor para facilitar o controle do sensor de temperatura e umidade
#include <DHT.h> // Inclui a biblioteca DHT para facilitar o controle do sensor de temperatura e umidade
#include <DHT_U.h> // Inclui a biblioteca DHT_U para facilitar o controle do sensor de temperatura e umidade
//----------------Define as constantes que a biblioteca necessita
#define DHTTYPE DHT11 // Define DHTTYPE como DHT11
//----------------Declara as variaveis do codigo----------------
int pinoDHT = 2; // Declara a variável pinoDHT e atribui o valor 2 a ela
DHT_Unified dht(pinoDHT, DHTTYPE); // Declara a variável dht para utilizar as funcoes de biblioteca Servo
//----------------Funcao executada uma vez na inicializacao do sistema----------------
void setup() {
Serial.begin(9600); // Inicializa a comunicação serial
dht.begin(); // Inicializa o sensor de temperatura e umidade
}
//----------------Funcao executada repetidamente enquanto o sistema estiver ligado----------------
void loop() {
delay(30000); // Aguarda 1500 milissegundos (1,5 segundos)
sensors_event_t event; // Cria uma variável temporaria para a leitura das mensagens enviadas pelo sensor
dht.temperature().getEvent(&event); // Faz a leitura da temperatura
// Caso contrário (temperatura e um numero), executa as instrucoes entre chaves
Serial.print(F("Temperatura: ")); // Escreve o texto entre aspas no monitor serial
Serial.print(event.temperature); // Escreve o valor de event.temperature no monitor serial
Serial.println(F("°C")); // Escreve o texto entre aspas no monitor serial e passa para a próxima linha
dht.humidity().getEvent(&event); // Faz a leitura da umidade
Serial.print(F("Umidade: ")); // Escreve o texto entre aspas no monitor serial
Serial.print(event.relative_humidity); // Escreve o valor da umidade no monitor serial
Serial.println(F("%")); // Escreve o texto entre aspas no monitor serial e passa para a próxima linha
//Formula
Serial.print(F("Evapotranspiracao: ")); // Escreve o texto entre aspas no monitor serial
Serial.print(1.21*10*((7.45*event.temperature)/(234.7+event.temperature))*(1-(0.01*event.relative_humidity))+((0.21*event.temperature)-2.3)); // Escreve o valor da umidade no monitor serial
Serial.println(F("mm/dia")); // Escreve o texto entre aspas no monitor serial e passa para a próxima linha
}
//----------------Inclui as bibliotecas do codigo----------------
#include <Adafruit_Sensor.h> // Inclui a biblioteca Adafruit_Sensor para facilitar o controle do sensor de temperatura e umidade
#include <DHT.h> // Inclui a biblioteca DHT para facilitar o controle do sensor de temperatura e umidade
#include <DHT_U.h> // Inclui a biblioteca DHT_U para facilitar o controle do sensor de temperatura e umidade
//----------------Define as constantes que a biblioteca necessita
#define DHTTYPE DHT11 // Define DHTTYPE como DHT11
//----------------Declara as variaveis do codigo----------------
int pinoDHT = 2; // Declara a variável pinoDHT e atribui o valor 2 a ela
DHT_Unified dht(pinoDHT, DHTTYPE); // Declara a variável dht para utilizar as funcoes de biblioteca Servo
//----------------Funcao executada uma vez na inicializacao do sistema----------------
void setup() {
Serial.begin(9600); // Inicializa a comunicação serial
dht.begin(); // Inicializa o sensor de temperatura e umidade
}
//----------------Funcao executada repetidamente enquanto o sistema estiver ligado----------------
void loop() {
delay(30000); // Aguarda 1500 milissegundos (1,5 segundos)
sensors_event_t event_t, event_h; // Cria uma variável temporaria para a leitura das mensagens enviadas pelo sensor
dht.temperature().getEvent(&event_t); // Faz a leitura da temperatura
// Caso contrário (temperatura e um numero), executa as instrucoes entre chaves
Serial.print(F("Temperatura: ")); // Escreve o texto entre aspas no monitor serial
Serial.print(event_t.temperature); // Escreve o valor de event.temperature no monitor serial
Serial.println(F("°C")); // Escreve o texto entre aspas no monitor serial e passa para a próxima linha
dht.humidity().getEvent(&event_h); // Faz a leitura da umidade
Serial.print(F("Umidade: ")); // Escreve o texto entre aspas no monitor serial
Serial.print(event_h.relative_humidity); // Escreve o valor da umidade no monitor serial
Serial.println(F("%")); // Escreve o texto entre aspas no monitor serial e passa para a próxima linha
//Formula
Serial.print(F("Evapotranspiracao: ")); // Escreve o texto entre aspas no monitor serial
Serial.print(1.21*10*((7.45*event_t.temperature)/(234.7+event_t.temperature))*(1-(0.01*event_h.relative_humidity))+((0.21*event_t.temperature)-2.3)); // Escreve o valor da umidade no monitor serial
Serial.println(F("mm/dia")); // Escreve o texto entre aspas no monitor serial e passa para a próxima linha
}
I'm not completely certain about this. But I suspect that line 49 is over-writing the temperature that was written to event.temperature in line 37. I think sensors_event_t might be a union type which can hold temperature or relative_humidity values but not both at the same time.
My change was to declare 2 separate variables event_t and event_h, so each can hold a separate value.
typedef struct {
...
union {
...
float temperature; /**< temperature is in degrees centigrade (Celsius) */
...
float relative_humidity; /**< relative humidity in percent */
...
}; ///< Union for the wide ranges of data we can carry
} sensors_event_t;