Go Down

Topic: Problemas com relé (Read 26051 times) previous topic - next topic

lmeireles43

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

lmeireles43

sobre o estados eu testei e funcionou perfeito, demais bubulinodo.
o que quer dizer esse [2] e o [10]
?

bubulindo

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:

Code: [Select]
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:

Code: [Select]

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.

Code: [Select]

void loop() {
updateTime(&agora);
}


E para usares a estrutura agora, fazes assim:

Code: [Select]

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);
This... is a hobby.

bubulindo


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.juliobattisti.com.br/tutoriais/katiaduarte/cbasico004.asp
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://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_tern%C3%A1ria
http://www.vivaolinux.com.br/topico/C-C++/O-operador-ternario-()
http://linguagemc.com.br/o-operador-ternario-em-c/
This... is a hobby.

lmeireles43

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....

bubulindo

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.

Code: [Select]
#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;
   }


}
This... is a hobby.

lmeireles43

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?

bubulindo

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:

Code: [Select]

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.
This... is a hobby.

lmeireles43

#53
Feb 03, 2013, 07:42 pm Last Edit: Feb 03, 2013, 10:08 pm by lmeireles43 Reason: 1
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

lmeireles43

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....

bubulindo

:)

Está tudo a funcionar como deve ser agora?
This... is a hobby.

lmeireles43

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

bubulindo

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. :)
This... is a hobby.

HugoPT

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


Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

lmeireles43

Pessoal primeiramente gostaria de agradecer vocês dois. Não teria conseguido sem voces.
segue o link do vídeo como prometido...
http://youtu.be/-4P-f0MGjns

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?

Go Up