Quanto ao numero 1, podes fazer algo mais artístico. LOL
const char estados[2][10] = {"LIGADO", "DESLIGADO"};
lcd.print(estados[statusheater]);
Quanto ao numero 1, podes fazer algo mais artístico. LOL
const char estados[2][10] = {"LIGADO", "DESLIGADO"};
lcd.print(estados[statusheater]);
bubulindo, tentei de tudo aqui mas a impressão de 10 em 10 segundos não funciona... fica 10 segundos o lcd em branco dai imprime o coisas.... então coloquei o cursos no 0,1 para um e 1,0 para o outro e imprime os dois ao mesmo tempo, tentei mudar algumas coisas mas não funciona.... o statusheater ainda não testei. Utilizei exatamente seu script apenas com a adição do lcd lógico porque tive um problema.... não consigo juntar a impressao da temperatura com a do tempo porque cada um esta me um void, então quando eu coloco em outro lugar ele fala que não esta declarado naquele escopo
void printDate(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111);
int weekDay = bcdToDec(Wire.read());
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
if (hour >= 10 && hour < 24) digitalWrite(luz, LOW);
if (hour >= 0 && hour < 10) digitalWrite(luz, HIGH);
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
lcd.setCursor(0,1);
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
}
void printTemp(){
ds.reset();
ds.select(addr);
ds.write(0x44,1);
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data = ds.read();
}*
unsigned int raw = (data[1] << 8) | data[0];*
if (type_s) {*
raw = raw << 3;*
if (data[7] == 0x10) {*
raw = (raw & 0xFFF0) + 12 - data[6];*
}}*
else {*
byte cfg = (data[4] & 0x60);*
if (cfg == 0x00) raw = raw << 3; *
else if (cfg == 0x20) raw = raw << 2;*
else if (cfg == 0x40) raw = raw << 1;*
}*
lcd.createChar(1,sinal);*
celsius = (float)raw / 16.0;*
if (celsius <= 27.0)digitalWrite(aquecedor, LOW);*
if (celsius >= 27.5)digitalWrite(aquecedor, HIGH);*
//statusHeater = digitalRead(aquecedor);*
if (celsius >= 28.0)digitalWrite(resfriador, LOW);*
if (celsius <= 27.5)digitalWrite(resfriador, HIGH);*
//statusFan = digitalRead(resfriador);*
Serial.print(" temperatura = ");*
Serial.print(celsius);*
Serial.println();*
lcd.clear();*
lcd.setCursor(0,0);*
lcd.print(celsius);*
lcd.write(1);*
}*
gostaria de fazer um
void printLCD(){
lcd.setCursor(0,0);
lcd.print(celsius);
lcd.write(1);
lcd.setCursor(0,1);
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
assim consigo organizar cada coisa... e coloco para rodar no void loop com os outros :
void loop(void) {
printDate();
printTemp();
}
em relação a temperatura eu até consigo mudar, mas o relógio se eu tirar do seu void e qualquer outro lugar que eu coloco da que HOUR não está declarado no escopo
sobre o estados eu testei e funcionou perfeito, demais bubulinodo.
o que quer dizer esse [2] e o [10]
?
Ok... aquele código parece correcto para mim.
Quanto ao que pretendes fazer, queres uma função que vá buscar a data e hora para meter no lcd, certo?
Experimenta adicionar isto no inicio:
struct data_hora {
unsigned char minuto;
unsigned char hora;
unsigned char dia;
unsigned char mes;
unsigned int ano;
} agora;
Isto é uma estrutura de dados que cria uma variável com o nome agora.
Depois a tua função printDate, passa a chamar-se updateTime e fica assim:
void updateTime(struct data_hora *dt){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int dummy = (unsigned char)bcdToDec(Wire.read());
dt->minuto = bcdToDec(Wire.read());
dt->hora = (unsigned char)bcdToDec(Wire.read() & 0b111111);
dummy = bcdToDec(Wire.read());
dt->dia = (unsigned char)bcdToDec(Wire.read());
dt->mes = (unsigned char)bcdToDec(Wire.read());
dt->ano = bcdToDec(Wire.read());
}
Depois tens de fazer update à estrutura agora em todos os ciclos.
void loop() {
updateTime(&agora);
}
E para usares a estrutura agora, fazes assim:
void printLCD(){
lcd.setCursor(0,0);
lcd.print(celsius);
lcd.write(1);
lcd.setCursor(0,1);
lcd.print(agora.hora);
lcd.print(":");
lcd.print(agora.minuto);
lmeireles43:
sobre o estados eu testei e funcionou perfeito, demais bubulinodo.
o que quer dizer esse [2] e o [10]
?
Antes de mais, alguma background teórico:
http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c530.html
o [2] é o numero de strings. Neste caso, tens duas, a LIGADO e DESLIGADO.
o [10] é o tamanho de ambas as matrizes, ou seja, o tamanho da maior string (desligado) mais um lugar vazio para colocar o terminador de string ('\0').
Julgava que me fosses perguntar o que era o ? e o : ...
Em todo o caso, fica aqui:
http://www.vivaolinux.com.br/topico/C-C++/O-operador-ternario-()
posso deletar por completo o void printDate que foi substituido por vois updateTime? este updateTime faltou segundo certo? eu só vou utilizar hora e minuto mesmo, nem dia nem mes nada.... apenas para o timer de ligar e desligar a luz. bubulindo aquele script de imprimir de 10 em 10 segundos não funciona mesmo....
Sim... se quiseres podes meter o segundo, eu não me dei ao trabalho porque vi que não o usavas.
Quando à alternancia, eu reparei que o Arduino tem algum significado para now. Também reparei que meti as variáveis como locais.
Este sketch funciona para alternar de 10 em 10 segundos.
#define TIMEOUT 10000
void setup(){
Serial.begin(19200);
}
unsigned long t_now = 0, before = 0;
unsigned char data = 0;
void loop(){
if((t_now = millis())-before > TIMEOUT) {
if (data == 0) {
Serial.print("COISAS");
data = 1;
} else {
Serial.print("OUTRAS COISAS");
data = 0;
}
before = t_now;
}
}
bubulindo agora funcionou, ta ficando muito legal, muito obrigado....
Só tem um problema o lcd fica os 10 primeiros segundos em branco....
ainda não coloquei esse script no meu, criei um a parte exatamente com as coisas que tu me passou, então notei que vai ter um conflito
Serial.begin(19200);
substitui pelo meu 9600?
aproveitando meu relógio marca 0:3 ou seja hora menor que 10 e minuto menor que 10 ele fica em uma casa decimal, fica estranho... como arrumo apara 00:03?
Podes imprimir alguma coisa no LCD dentro do setup para evitar isso de ficar em branco. Algo como o nome do sistema, por exemplo?
Sim, podes trocar pela baud que estás a usar. Aquilo é um exemplo e eu uso 19200 como defeito.
Para imprimir com zeros à frente, experimenta assim:
if (dt->minuto <10) lcd.print("0");
lcd.print(dt-minuto);
Isto tem a ver com a forma como o arduino faz a conversão de int para string. Assim parece-me ser a solução mais simples.
como eu consigo imprimir mais de duas coisas segundo seu script?
o unico jeito que consegui foi substituindo o data = número por data ++, só que ele chega no ultimo número e trava... seguindo a mesma lógica que vc fez em cada if dando numero para o data não consigo adicionar mais que dois... aaa tive que substituir o data por datatime porque ja estava usando uma variavel com data
se colocar data = 0 no teste 3 não funciona.
if((now = millis())-before > TIMEOUT) {
if (datatime == 2) {
lcd.print(teste3);
datatime++;
}
if (datatime == 1) {
lcd.print(teste2);
datatime++;
}
if (datatime == 0) {
lcd.print(teste1);
datatime++;
}
before = now;
}
quanto a hora e minuto menor que 10 deu certinho, vlw
conseguindo agora resolver este problema em cima vou fazer o video para mostrar para vcs
criei minha forma, criei a variavel seg e de 0 a 10 imprime uma coisa e no final coloquei seg++; entao de 11 a 21 imprime outra e por ai vai, quando passa eu criei um seg = 0 e recomeça tudo denovo... funcionou legal....
Está tudo a funcionar como deve ser agora?
Aparantemente sim, como falei não consegui criar mais de duas paginas de impressão com seu modo, então fiz com um contador... não sei se é a melhor forma ou se isto irá me trazer problemas...
esta semana faço o vídeo para vocês
Com um contador também funciona...
Aliás, pensando bem... como tens um RTC e estás a sincronizar a hora de X em X tempo, podes até usar isso para ir mudando a informação que mostras no ecrã.
Parabéns pelo projecto conseguido, é sempre bom ver algo que fazemos funcionar. Eu notei agora que meti os pés pelas mãos ao comprar um LCD shield que não é compatível com o Ethernet shield. Enfim... vou mesmo ter de pegar no ferro de soldar.
Mete fotos e vídeos para a gente se babar.
Parabéns por a tua dedicação ao teu projecto. Sabe bem ver tudo a funcionar e da uma enorme satisfação veres que conseguiste o que pretendias e que um grande projecto agora se tornou simples
Pessoal primeiramente gostaria de agradecer vocês dois. Não teria conseguido sem voces.
segue o link do vídeo como prometido...
vou deixar isto rolando por alguns dias e ver se da algum problema.... ja encomendei uma caixa plastica de 12x10x6 que deve chegar em um mês e então vou ligar o sistema real.... Próxima etapa quero um ethernet shield para colocar estes dados na internet.
também quero adicionar no sistema um sistema de dosagem de quimicos no aquario, bem como controlar a temperatura do dissipador da luminária led.
o que acharam?
bubulindo, segundo o script que vc me passou em relação aos estados (ligado, desligado) como posso substituir eles por caracteres especiais? ja montei eles, e montei tambem para temperatura e relogio que ja estão funcionando... ficou bem legal.
para imprimir eles no lcd se usa o comando lcd.write(1); o 1 eu relacionei a um caracter, porém quando eu tento substituir diretamente pelo ligado por exemplo e envio o sketch para o arduino ele trava...
outra situação é, criei vários caracteres.... tem como eu criar um arquivo a parte e gravar na biblioteca? porque encheu o arquivo de caracteres especiais.
Gostei do vídeo. Acho que podias escrever Aquecedor e Refrigerador para ficar mais "bonito".
Define caracteres especiais? Será algo assim:
Tens um pedaço de código para eu entender o que está a acontecer e travar o sistema?
Como assim, um arquivo à parte? O que é para ti um arquivo? Referes-te a criar isso num ficheiro para poderes usar quando quiseres sem teres de ter isso no ficheiro de código do Arduino?
Quanto às tuas sugestões... Meter os dados na internet é bacano. Eu estou a pensar algo assim para a minha casa nova. Não será muito difícil creio.
Já regular a dosagem dos químicos é que não acho tão simples de fazer ou aconselhável, apenas porque podes matar os peixitos.
Como assim controlar a temperatura do dissipador da luminária? :\
isto mesmo, ja criei o character, vamos utilizar o exemplo da página porque não tenho o meu aqui em mãos:
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
void setup() {
lcd.createChar(0, smiley);
}
agora basta eu colocar lcd.write(0); que imprime...
mas quro que substitua o off:
const char estados[2][10] = {"ON ", "OFF"};
assim const char estados[2][10] = {"ON ", smiley};
quanto ao ficheiro, correto, bem isto que quero....
tipo não sei se funciona assim mas criar um ficheiro simbolos.h
e no principal escrever
#include <simbolos.h> para carregar ele....
quanto a colocar dados na internet o site exosite.com acho que faz isto não? teria outra indicação?
quanto a controlar os químicos ja existem pessoas fazendo isto e tambem o sistema pronto... basicamente eu tenho que controlar o tempo de funcionamento da bomba com o arduino para que ela dose certo.... a bomba se chama bomba peristáltica
controlar a temperatura da luminária porque o ventilador que refrigera o dissipador faz um pouco de barulho e a maior parte do tempo pode funcionar a 20% de sua capacidade.. então quero criar algo que, se tiver a determinada temperatura, ele funciona a 20% se aumentar a temperatura do dissipador, aumenta a velocidade do ventilador para 40% e por ai vai... se chegar numa temperatura critica desarma a luminária para que nada se queime... por exemplo, rompeu o fio do ventilador ou o mesmo não funciona, temperatura da luminaria aumenta sem parar e queimam os leds...., entao o arduino desligara a luminaria antes que isto aconteça.... estou pensando em colocar um lm35 colado no aluminio do dissipador juntamente com um isolante térmico para a temperatura externa não atrapalhar a leitura....