Preciso de ajuda, criei o código abaixo que reconhece as teclas e a LCD Shield em si, preciso fazer que as teclas naveguem entre menu, e quando apertar selcionar ele entre no menu e consiga ligar e desligar um relé.
Por Favor me ajudem, quando eu entro na VOID SALA01() por exemplo tem q aparecer uma tela escrita Relé: HIGH dai se a pessoa aperta pra baixo, ou pra cima aparece Relé: LOW e se apertar enter ele volta pro menu inicial com a variável definida, se você deixou selecionado HIGH ele fica HIGH...
Estou a procura de algum dispositivo remoto também, para acionar ao invés das teclas da LCD, eu havia tentado usar um Infra Vermelho, mas não achei aqui na minha cidade pra comprar o receptor...
Se alguém tiver uma idéia...
Outra coisa, tem como salvar no arduino a posição dos relés mesmo q eu desligue ele?
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //use a pinagem de seu arduino
int up;
int down;
int nothing;
int right;
int left;
int enter;
int sel;
int x;
int y;
void setup() {
lcd.begin(16, 2);
sel = 1;
x = 0;
y = 0;
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 0;
}
void loop(){
int tecla_valor = analogRead(0);
if (tecla_valor == 1023){
up = 0;
down = 0;
right = 0;
left = 0;
enter = 0;
nothing = 1;
}
if (tecla_valor == 0)
{
right = 1;
}
if ((tecla_valor >= 120) & (tecla_valor <= 146))
{
up = 1;
}
if ((tecla_valor >= 300) & (tecla_valor <= 350))
{
down = 1;
}
if ((tecla_valor >= 500) & (tecla_valor <= 530))
{
left = 1;
}
if ((tecla_valor >= 700) & (tecla_valor <= 790))
{
enter = 1;
}
delay(250);
if (right == 1){
sel++;
}
if (left == 1){
sel--;
}
if (sel<=1){
sel=1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Setor:");
lcd.setCursor(0,1);
lcd.print(" Sala01 >> ");
if (enter == 1){
sala01();
}
}
if (sel==2){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Setor:");
lcd.setCursor(0,1);
lcd.print(" << Sala02 >> ");
if (enter == 1){
sala02();
}
}
if (sel==3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Setor:");
lcd.setCursor(0,1);
lcd.print(" << Sala03 ");
if (enter == 1){
sala03();
}
}
}
void sala01(){
lcd.clear();
lcd.print("Sala ON");
delay(3000);
loop;
}
void sala02(){
lcd.clear();
lcd.print("Sala ON");
delay(3000);
loop;
}
void sala03(){
lcd.clear();
lcd.print("Sala ON");
delay(3000);
loop;
}
Tem como gravar coisas persistentes no arduino sim, utilizando a library EEPROM.
Por exemplo:
#include <EEPROM.h>
byte relayState[1];
void setup() {
relayState[0] = EEPROM.read(0); // Aqui você lê do endereço 0 da EEPROM e joga na variável relayState[0]
}
void loop() {
// Quando seu botão for apertado e você quiser gravar
relayState[0] = 1;
EEPROM.write(0, relayState[0]);
}
quero saber a questão das saidas digitais, como faço pra ligar elas,...
e também como salvo as configurações só quando quiser, tipo acho q da pra fazer uma entrada no menu Salvar Configs, e outra Limpar Configs ambas com voids separadas....
Não sei se entendi direito o que vc quer dizer com ligar saídas digitais. Se for o que eu entendi, simplesmente coloque um pinMode(2, OUTPUT) no setup() e depois digitalWrite(2, HIGH) ou LOW para liga-la ou desliga-la. A porta 2 do seu arduino vai ser uma porta de saída que vai ligar e desligar apenas.
o salvar e limpar é simples também. faça uma função que vai salvar todas suas variáveis globais(as que são definidas fora de qualquer função) para o EEPROM. Você só vai precisar tomar cuidado com os endereços delas(recomendo utilizar um #define para cada variável com o endereço onde ela vai ser gravada).
tipo tem um menu que você seleciona no meu programa que entra na void, tipo void sala_01, sala_02... dai se eu apertar para os lados ele tem q trocar HIGH/LOW da entrada do relé, depois q eu selecionei ele deve ativar um temporizador e esperar 3s e voltar para o inicial...
mais ou menos assim...
void_sala(){
lcd.printf("Lampada:");
lcd.printf(estado_rele);
if (tecla_cima==1){
if (estado_rele==1){
estado_rele=0;
}
if (estado_rele==0){
estado_rele=0;
}
}
if (tecla_baixo==1){
if (estado_rele==1){
estado_rele=0;
}
if (estado_rele==0){
estado_rele=0;
}
}
if (estado_rele==1){
Olha seu codigo está muito confuso realmente, acho que você está usando coisa d+ para pouco assunto.
Uma parte que posso te ajudar, são algumas funções que vc pode adaptar e economizar codigo.
Para receber pela serial:
// Recebe sinal serial do Modulo-02 Bluetooth e Rede para controle dos Canais
if (entradaSerial.available())
{
Serial.print((char)entradaSerial.read());
}
if (entradaSerial.available())
{
recepSerial =(char)entradaSerial.read();
switch (recepSerial)
{
case '1':
Serial.println();
Serial.print(recepSerial);
alteraEstado(canal1);
break;
}
}
FunÇão do Controle Remoto (Você encontra esse receptor em qualquer eletronica, so pedir para TV CCE ou Sony)
// Função que recebe um valor do Controle de IR
if (irrecv.decode(&results))
{
switch(results.value)
{
case 16728765:
CANAL=canal1;
op=16728765;
imprimeSerial(1);
break;
case 16761405:
CANAL=canal2;
op=16761405;
break;
case 16773135:
CANAL=canal3;
op=16773135;
break;
case 16742535:
CANAL=canal4;
op=16742535;
break;
case 16716015:
if(tempo!=0)
{
tempo=0;
}else
{
tempo=1;
}
op=16716015;
break;
default:
op=0;
break;
}
if(results.value==op)
{
alteraEstado(CANAL);
}
irrecv.resume(); // Receive the next value