Olá pessoal, não sou muito bom com programação, e fiz adaptação em um código para que acione um relé de 15 em 15 minutos, porém estou usando relé duplo que no código configurei para acionar o relé 1 e 2 alternadamente, ou seja, quando desativa 1 ativa o outro, dessa forma posso usar 2 bombas alternadamente entre os tempos em determinado horário do dia.

O que necessito é que após o horário determinado os dois relé fiquem desligados, e com o atual codigo funcionando alternadamente 1 relé fica ligado...

Alguém poderia ajustar esse meu código para que apos horário  programado faça com que deixe os 2 relé desligados até o próximo ciclo.

Segue código, no exemplo ele aciona 5 segundos ligado e 5 segundos desligado, onde 5 ligado aciona relé 1 e nos 5 desligado aciona relé 2.

*/

int bomb1 = 9;
int bomb2 = 10;
int bomb3 = 11;
int bomb4 = 13; // LED conectado ao pino digital 12
int value = LOW; // último valor do LED
long previousMillis = 0; // último momento que o LED foi atualizado
long interval = 5000; // tempo de transição entre estados (milisegundos)


#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal_I2C.h>

//Inicializando LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);

// mensagens do sistema
const char *string_table[] =
{
" Horta Neo Park ", //0
"Bomba Desligada", //1
"Bomba 1 e 2 Ligada", //2
"Bomba 3 e 4 Ligada", //3

};

//Converter números decimais normais para binário codificado decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

//Converter decimal binário codificado para números decimais normais
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// 1) Define a data e a hora no ds1307
// 2) Inicia o relógio
// 3) Define o modo de hora a relógio de 24 horas
// Assume que você está passando em números válidos
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 a 7 bit no cronômetro
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // Se você quiser am 12 hora / pm é necessário definir
// 6 bit (também precisa mudar readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}

// Obtém a data e hora do ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year )
{
// Reset o ponteiro registro
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// Algumas delas precisam de máscaras porque certos bits são bits de controle
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Necessidade de mudar isso se 12 horas am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void setup()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
Serial.begin(9600);

// LCD inicialização
lcd.init();
lcd.backlight(); // com luz de fundo
lcd.clear(); // tela limpa

// configura o pino digital como saída
pinMode(bomb1, OUTPUT);
pinMode(bomb2, OUTPUT);
pinMode(bomb3, OUTPUT);
pinMode(bomb4, OUTPUT);

// Alterar esses valores para o que você quer definir o seu relógio para.
// Você provavelmente só quer definir o seu relógio uma vez e, em seguida, remover
//the setDateDs1307 call.
second = 25;
minute = 59;
hour = 17;
dayOfWeek = 0;
dayOfMonth = 20;
month = 7;
year = 15;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}

void loop()
{
MostraData();
AtualizaSaidas();
delay(1000);
}

void MostraData(){

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

lcd.setCursor(1,0);

if (hour < 10)
{
lcd.print("0");
}

lcd.print(hour,DEC);
lcd.setCursor(3, 0);
lcd.print(":");
lcd.setCursor(4, 0);

if (minute < 10)
{
lcd.print("0");
}

lcd.print(minute,DEC);
lcd.setCursor(6, 0);
lcd.print(":");
lcd.setCursor(7, 0);
if (second < 10)
{
lcd.print("0");
}

lcd.print(second,DEC);
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(11, 0);

if (dayOfMonth < 10)
{
lcd.print("0");
}

lcd.print(dayOfMonth,DEC);
lcd.setCursor(13, 0);
lcd.print("/");
lcd.setCursor(14, 0);

if (month < 10)
{
lcd.print("0");

}
lcd.print(month,DEC);
lcd.setCursor(16, 0);

if (month < 10)

{

lcd.print("0");

}
lcd.print(year,DEC);
lcd.setCursor(16, 0);
lcd.print("/");
lcd.setCursor(17, 0);
}

void AtualizaSaidas() {

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

//Bomba 1 e 2 : Ligada entre 06:00 e 18:00 todos os dias
if ((hour >=06 &minute >=00 &second >=01) && (hour <=17 &minute <=59 &second <=53))

if (millis() - previousMillis > interval) {
previousMillis = millis(); // lembra do último tempo que piscou o LED

// se o LED está apagado, acenda-o e vice-versa.
if (value == LOW)

{

lcd.clear();
MostraData();
lcd.setCursor(1, 2);
lcd.print(string_table[2]);
value = HIGH;
digitalWrite(bomb1, value);
digitalWrite(bomb4, LOW);
delay (250);

}

else

{
lcd.clear();
MostraData();
lcd.setCursor(1, 2);
lcd.print(string_table[3]);
value = LOW;
digitalWrite(bomb1, value);
digitalWrite(bomb4, HIGH);
delay (250);

}
}
}

Exibições: 970

Responder esta

Respostas a este tópico

não custa falar, mas não basta usar apenas a biblioteca ok? É necessário conectar o módulo apropriado que fará a "conversão" dos pinos do LCD pra serem usados apenas 4 fios

Esse é o tal módulo que faz a conversão:

imhugo,

Não custa mesmo falar, e eu agradeço, as vezes nas coisas mais simples é onde temos o erro e não sabemos, o famoso ditado da arvore que não nos deixa enxergar o bosque, acredite, o motivo então é esse, eu simplesmente estava tentando compilar o code com sem ter nada espetado para depois fazer uma simulação no Proteus, obrigado pelo esclarecimento.

Abs.

ah ok... eu havia desconfiado disso mesmo, mas fiquei sem jeito pra falar sem ofender.

Mas enfim, vou te dizer uma coisa: esse tal módulo i2c é realmente muito bacana. Hoje em dia me recuso a usar um lcd 16x2 sem tal módulo. Me facilitou demais a minha vida. Mande vir alguns da china no dx. Custa baratinho (menos de R$ 10,00 cada unidade e não se paga frete) e funciona que é uma beleza!

imhugo,

Tranquilo... Só não erra que nada faz, comigo não tem problema, sinta-se a vontade.

Por outra parte, gostei mesmo do i2c por essa versatilidade que pode dar ao projeto e eu uso bastante display nos meus, somente te digo uma coisa, não sei quanto demora pra vir da china, mas acabei de comprar alguns por R$18,00 cada, com tal de não esperar acho que vale a pena tratando-se de uma soma não muito importante, sim, é 80% a mais, mas vale no sentido de não esperar no meu caso.

Uma vez mais obrigado e lembre-se que estamos aqui para aprender um do outro, por tanto não me sentiria ofendido de nenhuma maneira.

PD, acabei achando por R$15,00

Abs.

realmente a diferença em reais é pequena e não vale a pena esperar mesmo.

Caso a diferença ficasse grande, aí sim valeria a pena importar.

Eu quando mandei vir da china aproveitei pra comprar outras coisas junto e daí a oportunidade

Neste caso sim, se trouxer mais coisas faz sentido, depois comento o resultado mas tenho certeza que vai valer a pena, e então sim vou ter que importar da china!

Abs.

Carlos eu nunca havia usado o modulo I2C. Soldei um ao lcd aki rapidinho usei esta biblioteca..

https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/Liqui...

no Arduino 1.0.6.funcionou..

Olhei por este site: http://www.arduinoecia.com.br/2014/12/modulo-i2c-display-16x2-ardui...

No Arduino 1.6.4 esta dando o seguinte erro 

collect2.exe: error: ld returned 5 exit status

..............

Alexandre,

Obrigado pela dica, mas leia acima minha resposta ao colega imhugo, com certeza esse é o motivo de não esta conseguindo compilar um code.

Abs.

Opa...Alexandre

Eu na verdade tive de adaptar, o código original de onde tirei era para display normal, inclui a biblioteca do display que eu dispunha e já estava utilizando, desta forma minha sugestão para você é  a mesma, altere display para o qual você já possui, eu particularmente ainda terei de alterar código  para display 16x2 I2C que encomendei da china, como hoje tenho e uso o 20x4 é o que estou usando para testes.

Eu adquiri na china por 9,90 cada display, comprei de forma separada modulo (0,99 centavos dollar) e display(1,86 dollar)

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço