Commit 49ebb16b authored by unixjazz's avatar unixjazz
Browse files

Adicionado outro examplo: usando funcao delay()

No related merge requests found
Showing with 76 additions and 87 deletions
+76 -87
#include <Wire.h> //inicializa o protocolo I2C, porta na qual controla o display
#include "rgb_lcd.h" //biblioteca de controle do display rgb grove
//#include <math.h> //cálculo da leitura do sensor de temperatura
#include <Wire.h> // inicializa o protocolo I2C, porta na qual controla o display
#include "rgb_lcd.h" // biblioteca de controle do display rgb grove
//#include <math.h> // cálculo da leitura do sensor de temperatura
#define sensorSolo A0 //define a porta analógica A0 (sensor humidade do solo)
#define sensorTemperatura A1 //define a porta analógica A0 (sensor temperatura)
#define relay 8 //define a porta digital 8 (relê)
#define botaoManual 3 //#define botaoManual 4 //define a porta digital 8 (botão para uso manual ou automático)
#define sensorSolo A0 // define a porta analógica A0 (sensor humidade do solo)
#define sensorTemperatura A1 // define a porta analógica A0 (sensor temperatura)
#define relay 8 // define a porta digital 8 (relê)
#define botaoManual 3 // define botão para uso manual ou automático
const int AUTO = 0;
const int DESLIGADO = 0;
const int LIGADO = 1;
const int DESLIGADO = 2;
const int AUTO = 2;
int temperatura = 0.0, ultimaTemp = 0.0;
int valorUmidade = 0.0, ultimaUmid = 0.0;
int estadoRele = AUTO; // Estado inicial do relé (desligado)
bool ultimoEstadoBotao = HIGH; // Estado inicial do botão
float temperatura = 0;
float ultimaTemp = 0;
float valorUmidade = 0;
float ultimaUmid = 0;
int estadoRele = DESLIGADO; // Estado inicial do relé (desligado)
bool ultimoEstadoBotao = HIGH; // Estado inicial do botão
const int NUM_LEITURAS = 5; // constante com número de leituras para média
const int INTERVALO_ENTRE_LEITURAS = 2000; // 1000ms = 1s
const int NUM_LEITURAS = 5; // constante com número de leituras para média
const int INTERVALO_ENTRE_LEITURAS = 2000; // 1000ms = 1s
// variáveis para cálculo de tempo
unsigned long tempoInicial;
unsigned long tempoFinal;
// ex: intervalor de horas
int INTERVALO 12;
int leituras[NUM_LEITURAS]; // vetor com NUM_LEITURAS posições
int indiceLeitura = 0;
......@@ -31,27 +33,27 @@ int total = 0;
int mediaTemp = 0;
rgb_lcd lcd;
void setRGB(int r, int g, int b); //cria as variáveis ¨R¨ ¨G¨ ¨B¨ através da ferramenta ¨int¨
void setRGB(int r, int g, int b); // cria as variáveis "R" "G" "B" através de vars "inteiros"
// Controle do relê
void controlaRele() {
switch (estadoRele) {
case (AUTO):
digitalWrite(relay, HIGH);
estadoRele = LIGADO;
//lcd.clear(); //exibe no lcd as informações do serial
case (DESLIGADO):
estadoRele = DESLIGADO;
lcd.clear(); //exibe no lcd as informações do serial
//lcd.setCursor(0, 0);
//lcd.setRGB(20, 200, 10); //coloração do display lcd
//lcd.print("LIGADO");
Serial.println("LIGADO");
//lcd.setRGB(90, 110, 100); //coloração do display lcd
//lcd.print("DESLIGADO");
Serial.println("DESLIGADO");
break;
case (LIGADO):
digitalWrite(relay, LOW);
estadoRele = DESLIGADO;
estadoRele = LIGADO;
//lcd.clear(); //exibe no lcd as informações do serial
//lcd.setCursor(0, 0);
//lcd.setRGB(200, 10, 10); //coloração do display lcd
//lcd.print("DESLIGADO");
Serial.println("DESLIGADO");
//lcd.print("LIGADO");
Serial.println("LIGADO");
break;
case (DESLIGADO):
estadoRele = AUTO;
......@@ -62,89 +64,76 @@ void controlaRele() {
Serial.println("AUTOMATICO");
break;
}
delay(100);
delay(1000);
}
void setup() {
pinMode(sensorSolo, INPUT); //define o sensor de humidade do solo como entrada
Serial.begin(9600);
pinMode(temperatura, INPUT); //define sensor de temperatura como entrada
pinMode(relay, OUTPUT); //define o relê como saída
pinMode(botaoManual, INPUT_PULLUP); //define o botão como entrada
tempoInicial = millis();
pinMode(sensorSolo, INPUT); // define o sensor de humidade do solo como entrada
Serial.begin(9600); // inicia porta serial, velocidade 9600bps
pinMode(temperatura, INPUT); // define sensor de temperatura como entrada
pinMode(relay, OUTPUT); // define o relê como saída
pinMode(botaoManual, INPUT_PULLUP); // define o botão como entrada
attachInterrupt(digitalPinToInterrupt(botaoManual), controlaRele, FALLING);
lcd.begin(16, 2); //defina a escala do display. 16 colunas e 2 linhas.
lcd.setRGB(90, 110, 100); //coloração do display lcd
lcd.print("hyakua");
lcd.begin(16, 2); // defina a escala do display. 16 colunas e 2 linhas.
lcd.setRGB(90, 110, 100); // coloração do display lcd
lcd.print(":: hyakua ::");
delay(3000);
}
int calculaMedia(){
int calculaMedia() {
// Lê o sensor de temp
temperatura = (analogRead(sensorTemperatura) * (5.0 / 1023)) / 0.1;
// calcula a media
total = total - leituras[indiceLeitura];
leituras[indiceLeitura] = temperatura;
total = total + leituras[indiceLeitura];
indiceLeitura = (indiceLeitura + 1) % NUM_LEITURAS;
// retorna media
return (total / NUM_LEITURAS);
}
void loop(){
tempoFinal = millis();
void loop() {
// Leitura analogica da porta A0 (sensorSolo) & funcao map() para ajustar os valores
int valorUmidade = map(analogRead(sensorSolo), 0, 1023, 137, 0);
if ((tempoFinal - tempoInicial) > INTERVALO_ENTRE_LEITURAS){
tempoInicial = millis();
// Imprime no monitor serial os resultados de leitura dos sensores
Serial.print("Umidade: ");
Serial.print(valorUmidade);
Serial.println("%");
//for (int i = 0; i < 10; i++) {
temperatura = (analogRead(sensorTemperatura) * (5.0 / 1023)) / 0.1;
//temperatura = temperatura + media[i];
// Calcula media de temperatura e imprime no monitor
mediaTemp = calculaMedia();
//if(temperatura!=ultimaTemp){
//ultimaTemp=temperatura;
Serial.print("Temperatura: ");
Serial.println(mediaTemp);
//temperatura = temperatura / 10; //faz a leitura analógica da porta A1 (sensorTemperatura) passando por um cálculo que ajusta os valores
//if (temperatura != ultimaTemp) { //imprime na porta serial apenas se o valor de temperatura mudar
//ultimaTemp = temperatura;
int valorUmidade = map(analogRead(sensorSolo), 0, 1023, 137, 0); //faz a leitura analógica da porta A0 (sensorSolo) passando pela função map() para ajustar os valores lidos às porcentagens que queremos utilizar
if (valorUmidade != ultimaUmid) { //imprime na porta serial apenas se o valor de umidade mudar
ultimaUmid = valorUmidade;
}
Serial.print("umidade: "); //imprime no monitor serial a as palavras umidade, temperatura e seus respectivos valores
Serial.print(valorUmidade);
Serial.println("%");
Serial.print("temperatura: ");
Serial.println(mediaTemp);
lcd.clear(); //exibe no lcd as informações do serial
lcd.setCursor(0, 0);
lcd.print("umidade: ");
lcd.print("%");
lcd.print(valorUmidade);
lcd.setCursor(0, 1);
lcd.print(" temp: ");
lcd.print((char)223);
lcd.print("C");
lcd.print(mediaTemp);
// Exibe as informacoes dos sensores no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Umidade: ");
lcd.print("%");
lcd.print(valorUmidade);
lcd.setCursor(0, 1);
lcd.print(" Temp: ");
lcd.print((char)223);
lcd.print("C");
lcd.print(mediaTemp);
// Testa se é necessario acionar valvula d'agua
if (estadoRele == AUTO) {
if (valorUmidade >= 30) { //liga e desliga relê que controla a valvula solenoine quando menos de 30% de umidade
digitalWrite(8, LOW);
//
// Aciona rele se umidade estiver baixa
//
if (valorUmidade >= 30) {
digitalWrite(8, LOW);
} else {
digitalWrite(8, HIGH);
}
}
}
// Espera por INTERVALO (horas) e repete o procedimento
delay(INTERVALO*60UL*60UL*1000UL);
}
//}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment