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

Tenta trocar o final para isso depois fala se funfou! Troca o final todo desde o void Atualiz...... estava faltado uma chaves no if das horas!?

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);

}
}
}
else {
digitalWrite(bomb4, LOW);
digitalWrite(bomb1, LOW);
}
}

Perfeito Alexandre A. M. Nogueira  funcionou, Obrigado!

Caso eu queira incluir um novo horário tipo a noite, Ex:

//Bomba 1 e 2 : Ligada entre 23:00 e 23:30 todos os dias
if ((hour >=23 &minute >=00 &second >=01) && (hour <=23 &minute <=39 &second <=00)) {

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);

Em qual parte devo inserir esse novo código, poderia me dar mais essa ajuda!

E devo manter

else {
digitalWrite(bomb4, LOW); 
digitalWrite(bomb1, LOW); 
}

No final vai servi para todos horários ?

Tenta fazendo um OR dos horários!!!

*/

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 e das 23:00 as 23:39 todos os dias
if (
((hour >=06 &minute >=00 &second >=01) && (hour <=17 &minute <=59 &second <=53) )
|| ((hour >=23 &minute >=00 &second >=01) && (hour <=23 &minute <=39 &second <=00))
) {

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);

}
}
}
else {
digitalWrite(bomb4, LOW);
digitalWrite(bomb1, LOW);
}
}

Já tentei, porém não faz leitura do tempo liga e desliga corretamente, ele funciona de minuto e minuto (não sei de onde tira esse tempo) pois no exemplo esta de 5 em 5 segundos....

Opa descobri o erro...Estava com conflito os segundos...Fiz ajuste e funcionou... ((hour >=23 &minute >=00 &second >=01) && (hour >=23 &minute <=29))

Valeu, obrigado ai Alexandre A. M. Nogueira  !

Abraço...

 Alexandre A. M. Nogueira notei um outro erro, poderia me ajudar!?  

O RTC ao desligar ou reiniciar o arduino não está segurando a hora ajustada, e inicia conforme configuração original, o que está errado no código?

Já mudei e testei o RTC em outro aplicativo e está funcionando tudo ok, porém nos outros aplicativos o código RTC são outros.

Obrigado

Já descobri,  Obrigado... Basta alterar:

//setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

Paulo não sei se você esta acompanhando o tópico irrigação... tinha postado os links lá vou postar aki também...

Para quem gosta de horta em casa!

http://hortas.info/

http://www.noocity.com/pt/biblioteca/

https://permacoletivo.files.wordpress.com/2008/06/manual-horta-organica-domestica.pdf

Valeu vou acompanhar, estou num projeto grande de automação de horta, hoje descobri mais um erro porem de Relay, adquiri um modelo no Mercado livre com 2 CH e eles na porta NA funcionam de forma contrária ao código, ou seja, LOW liga o NA e HIGH desliga, é isso ta me dando uma enorme dor de cabeça, pois esse outro código é para acionar contatora e se eu ligar na porta NF (para poder funcionar com esse código) simplesmente se por algum motivo eu desligar a placa arduino ou qualquer travamento que venha ocorrer na placa vai ligar a Contatora e acionar motor deixando a horta encharcada (Tomate em vasos) e não pode ocorrer isso.

Tentei inverter no código o meio de acionamento alterando LOW e HIGH, porém tem LED que estão associados ao acionamento e também tempos de delay que ficam todos incompatíveis com as leituras do sistema.

Enfim descobri que relay 2CH esta invertido por tinha um simples de !CH com led verde indicador de ligado e esse simples está normal.

Ai fica minha pergunta quando comprar RELAY tem essas diferença, ou seja aciona em LOW (0v) e ou HIGH (5v), procurei e não achei nada sobre isso nos sites de venda.

 

Olá Paulo e Alexandre,

Estou com um problema ao tentar compilar códigos com o display LCD I2c, ja tentei varias bibliotecas e me da erro, poderiam por favor me dizer que biblioteca estão usando e se possível o link, porque pelo visto não tiveram este tipo de problema, presumo que se usar a mesma biblioteca poderei solucionar meu problema aqui.

Desde já obrigado.

Abs.

Oi Carlos, essa biblioteca pro LCD i2c é aquela  que permite economizar pinos do arduino, reduzindo de 14~16 pinos pra apenas 4?

Caso positivo, eu uso essa: http://m5.img.dxcdn.com/CDDriver/CD/sku.216865.rar

Oi imhugo,

obrigado pela resposta, vou tentar baixar e usar esta, confesso que estou apanhando aqui e ainda sem entender, assim que tiver resultado, positivo, ou não dou retorno aqui.

Abs.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço