Pages: 1 ... 6 7 [8] 9   Go Down
Author Topic: Problemas com relé  (Read 14120 times)
0 Members and 1 Guest are viewing this topic.
Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim no programa principal tens de fazer o include desse .h e depois usar antes do nome da variável a keyword extern. Desta forma o compilador vai procurar essa variável fora do programa principal
Logged

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


'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3104
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tens de guardar o simbolos.h dentro duma pasta dentro da libraries.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tens uma forma rapida para usar mais ficheiros no projecto usando a IDE do arduino.Se reparares abaixo de onde abres a porta Serie na IDE tens uma seta para baixo, tocas ai e escolhes new tab.De seguida pede-te o nome do ficheiro, colocas o que quiseres com a extensao desejada .h ou .c
Assim desta forma consegues ver todos os ficheiros envolvidos no sketch e ir alterando-os conforme precisas.
Quando fazes guardar ele vai colocar esses ficheiros na mesma pasta do projecto.
Quando abrires novamente o projecto ele tambem irá abrir os ficheiros adicionais.
No final quando tiveres tudo como desejas podes entao colocar isso tudo ( o ficheiro de cabeçalho .h e o ficheiro de implementaçao .c) numa liblioteca para reutilizares de futuro, bastando depois incluir essa biblioteca no projecto.
Anexei uma foto para veres as abas em cima com dois ficheiros de exemplo


* Captura de ecrã 2013-02-8, às 20.40.31.png (42.22 KB, 513x607 - viewed 12 times.)
Logged

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


Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vlw Hugo vou verificar amanha...
bubulindo, ja havia colocado, e inclui o mesmo...

Hoje tenho novidades, comprei o FET e o photoprotector e liguei o arduino na bateria, isolando-o completamente.
Resultado, o lcd funciona mas a cada 10 segundos +- não é regra... o sensor de temperatura sobre interferencia e da problema, mas vai e volta rápido....
Ligando o arduino num adaptador AC o sensor de temperatura nem funciona.....
Será que posso fazer algo ou vou ter que trabalhar com a programação?

Ficou muito legal, com o tip120 eu não conseguia fazer os leds piscarem rapidamente, e os leds tambem não desligavam por completo.... com o FET o led pisca igual discoteca EHEHEHHEHEHE..... Estou rodando o aquario no momento com 60% da potencia dos azuis e 100% os brancos
sendo que o azul liga e depois de uma hora o branco liga, depois o branco desliga primeiro e depois de uma hora o azul desliga....

Tava pensando na programação do arduino para o sensor poderia colocar que se ele não for achado em tipo 2 segundos ai sim ele entrar em modo de segurança, desarmando os reles e enviando a mensagem de erro, caso contrario ele apenas deixa de registrar a temperatura maluca e continua tudo em funcionamento, o que acham?
olhem aqui meu problema
http://youtu.be/tunyB_o0mdI
deveria colocar algum resistor no sinal do arduino?
« Last Edit: February 08, 2013, 09:26:19 pm by lmeireles43 » Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gostei, o simbolo da temperatura fica muito fixe.Tens o sensor da dallas a ser alimentado pelos 5 V gerados na placa do arduino correcto?
Tens a resistencia de pull-up no sensor?
Podera nao ter nada a ver mas tenta baixar a resoluçao do sensor para 9 bits, desta forma ele é mais rapido a calcular a temperatura e 9 bits de resoluçao é suficiente.
Outra questao a lib do one-wire tem um metodo de calculo CRC8 para comprovar os dados recebidos, tens isso implementado no teu codigo essa verificaçao de CRC?
Tentei ir confirmar isso em posts anteriores mas nao vi la nada ou me espacou.
De qualquer forma coloca ai o codigo actual para estar mos sintonizados quando as alterações que ja fizeste.
« Last Edit: February 09, 2013, 04:40:58 am by HugoPT » Logged

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


'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3104
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Parabéns! Está bacano.

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ontem observei que o relogio também entra em pane mas com muito menos frequencia, vai a 45 horas smiley-razz e desliga a luz.... da uma piscada apenas.....
segue todo o código,
#include <OneWire.h>
#include <LiquidCrystal.h>
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#define Luz_Fundo 6

#define ledbranco 10
#define ledazul 9
const char estados[2][10] = {"ON ", "OFF"};

byte zero = 0x00;
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;

byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) ); // Converter decimal para código binário
}

byte bcdToDec(byte val)  {
  return ( (val/16*10) + (val%16) ); // Converter código binário para decimal
}

byte sinal[8] = { //símbolo de graus celsius
0b01000, 
0b10100,
0b01000,
0b00011,
0b00100,
0b00100,
0b00011,
0b00000
}; 

byte temperatura[8] = { //símbolo de graus celsius
0b01110, 
0b01010,
0b01110,
0b01110,
0b01110,
0b11111,
0b11111,
0b01110,
}; 

byte relogio[8] = { //símbolo de graus celsius
0b00000, 
0b11111,
0b10101,
0b10101,
0b10101,
0b10011,
0b10001,
0b11111,
}; 

byte minimo[8] = {
B01110,
B01010,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110
};

byte maximo[8] = {
B01110,
B01110,
B01110,
B01110,
B11111,
B11111,
B11111,
B01110
};

byte rsimb[8] = {
B00000,
B01010,
B00100,
B10101,
B01110,
B10101,
B00100,
B01010
};

byte asimb[8] = {
B01001,
B01001,
B10010,
B11011,
B01001,
B10010,
B10010,
B00000
};

struct data_hora {
unsigned char minuto;
unsigned char hora;
unsigned char dia;
unsigned char mes;
unsigned int ano;
} agora;

float tempMax;
float tempMin;
int seg = 0;

int pbranco = 0;
int Pbranco = 250;
int pazul = 0;
int Pazul = 150;
int statusHeater = 0;
int statusFan = 0;
int aquecedor = A0;
int resfriador = A2;
int temperatura_controle = 27.5;   
int vt = 0.5;
int luz_desligamento = 24;
int fp = 6; //fotoperíodo
OneWire  ds(A15); 

LiquidCrystal lcd(8, 7, 5, 4, 3, 2);


void setup(void) {
                    Serial.begin(19200);
                    pinMode(ledbranco, OUTPUT);
                    pinMode(aquecedor,OUTPUT); //define o pino do aquecedor como saída
               pinMode(resfriador,OUTPUT); //define o pino do resfriador como saída
                    pinMode(Luz_Fundo,OUTPUT); //define o pino como saída
               lcd.begin(16, 2); //inicia o lcd com 2 linhas e 16 colunas
               digitalWrite(Luz_Fundo,HIGH); // Liga a luz do display.
                    Wire.begin();
                    tempMax = 0;
                    tempMin = 100;
                    digitalWrite(aquecedor, HIGH);
                    digitalWrite(resfriador, HIGH);
                    //pinMode(fadePin, OUTPUT); //retirarrrrrrrrrrrrrr
                    //pinMode(fadePinn, OUTPUT); //retirarrrrrrrrrrr
                  }

void loop(void) {
                    if ( !ds.search(addr)) {
                    while (!ds.search(addr)) {  //enquanto não encontrar o sensor.
                    ds.reset_search();
                    delay(250);
                    digitalWrite(aquecedor, HIGH);
                    digitalWrite(resfriador, HIGH);
                    lcd.clear();
                    lcd.setCursor(1,0);
                    lcd.print("ERRO NO SENSOR");
                  }}
                    if (OneWire::crc8(addr, 7) != addr[7]) {
                    Serial.println("CRC não é válido!");
                    return;
                  }
                    else {
                      printTemp();
                      updateTime(&agora);
                      printLCD();
                      statusHeater = digitalRead(aquecedor);
                    statusFan = digitalRead(resfriador);
                    pbranco = (Pbranco * 100 / 250);
                    pazul = (Pazul * 100 / 250);
                                       
                    }}
 

       
                     
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] << smiley-cool | 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);
                     lcd.createChar(2,temperatura);
                     lcd.createChar(3,relogio);
                     lcd.createChar(4,maximo);
                     lcd.createChar(5,minimo);
                     lcd.createChar(6,asimb);
                     lcd.createChar(7,rsimb);
                     
                     celsius = (float)raw / 16.0;
                     if (celsius <= 27.0)digitalWrite(aquecedor, LOW);
             if (celsius >= 27.5)digitalWrite(aquecedor, HIGH);
                                                  
             if (celsius >= 28.0)digitalWrite(resfriador, LOW);
             if (celsius <= 27.5)digitalWrite(resfriador, HIGH);
             
                     if (celsius > tempMax) tempMax = celsius;
                     if (celsius < tempMin) tempMin = celsius;
                     }
 
 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());
                     if (agora.hora >= luz_desligamento - fp + 1 && agora.hora < luz_desligamento - 1) analogWrite(ledbranco, Pbranco);
                     if (agora.hora >= 0 && agora.hora < luz_desligamento - fp) analogWrite(ledbranco, 0);
                     if (agora.hora >= luz_desligamento - fp && agora.hora < luz_desligamento) analogWrite(ledazul, Pazul);
                     if (agora.hora >= 0 && agora.hora < luz_desligamento - fp) analogWrite(ledazul, 0);
}

void printLCD(){
                     
                     if (seg >= 0 && seg <=20) {
                     lcd.clear();
                     lcd.setCursor(0,0);
                     lcd.write(2);
                     lcd.print(celsius);
                     lcd.write(1);
                     lcd.setCursor(0,1);
                     lcd.write(3);
                     if (agora.hora <10) lcd.print("0");
                     lcd.print(agora.hora);
                     lcd.print(":");
                     if (agora.minuto <10) lcd.print("0");
                     lcd.print(agora.minuto);
     
                     lcd.setCursor(12,0);
                     lcd.write(6);
                     lcd.print(estados[statusHeater]);
           
                     lcd.setCursor(12,1);
                     lcd.write(7);
                     lcd.print(estados[statusFan]);
                     seg++;
                     }
     
                     if (seg >=21 && seg <=26){
                     lcd.clear();
                     lcd.setCursor(0,0);
                     lcd.write(4);
                     lcd.print(tempMax);
                     lcd.write(1);
                     lcd.setCursor(0,1);
                     lcd.write(5);
                     lcd.print(tempMin);
                     lcd.write(1);
                     lcd.setCursor(11,1);
                     lcd.print("B ");
                     lcd.print(pbranco);
                      lcd.setCursor(11,0);
                     lcd.print("A ");
                     lcd.print(pazul);
                     seg++; 
                     }
     
                    if (seg >= 27){
                    seg =0;
                    }
}
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3104
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas.

Não prestei muita atenção ao código, mas assim de repente podes melhorar isto:

Code:
const char estados[2][10] = {"ON ", "OFF"};

//por isto...

const char estados[2][4] = {"ON ", "OFF"}; //pormenores, eu sei... mas são 12 bytes que poupas :P

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bubulindo vlw a dica ja modifiquei...
resolvi o problema de imprimir temperaturas loucas assim:
                     if ((float)raw / 16.0 <= 100) {
                     if (celsius2/celsius >=0.9 && celsius2/celsius <=1.1)
                     { 
                     celsius = (float)raw / 16.0;
                     delay (1000);
                     }}
                     celsius2 = (float)raw / 16.0;
desta forma ele só atualiza o celsius se a temperatura for menor que 100 e tambem faz uma leitura e depois de um segundo faz outra, se a diferença for entre 0.9 e 1.1(isso da uma margem de quase 2 graus) ele grava o novo valor de temperatura..
agora acho que arrumei a parte de checar o sensor e se não achar travar tudo colocando um delay de dois segundos e repetindo a parte de checar, ou seja, ele checa espera dois segundo e checa denovo:

                   if ( !ds.search(addr)) {
                    delay (2000);
                    if ( !ds.search(addr)) {
                    while (!ds.search(addr)) {  //enquanto não encontrar o sensor.
                    ds.reset_search();
                    delay(250);
                    digitalWrite(aquecedor, HIGH);
                    digitalWrite(resfriador, HIGH);
                    lcd.clear();
                    lcd.setCursor(1,0);
                    lcd.print("ERRO NO SENSOR");
                  }}}

agora preciso arrumar o relógio, e alguem tem alguma dica do que fiz ou esta bom?
« Last Edit: February 09, 2013, 10:22:07 am by lmeireles43 » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

deu uma olhada no script hugo?
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3104
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu não olhei para o script, mas fiquei a pensar porque é que fazes a procura do sensor no loop.

Não devias fazer isso no setup para verificar que o sensor está lá e depois tentar ler dele? Certamente que a funcão de leitura dá um erro se o sensor não estiver lá, certo?

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no loop para ele sempre estar verificando se o sensor esta conectado porque em caso de um contato ruim a temperatura vai zerar, e assim o aquecedor vai ligar porque entende que a temperatura esta abaixo.... entao a cada loop ele verifica se o sensor esta marcando a temperatura, caso contratio desliga tudo e me alerta.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sobre o driver eu desisti dos meus. certamente produzem muito ruido magnético e deixa tudo pirado sem funcionar.... vou esperar um driver novo e vou tentar outros também.....
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3104
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

no loop para ele sempre estar verificando se o sensor esta conectado porque em caso de um contato ruim a temperatura vai zerar, e assim o aquecedor vai ligar porque entende que a temperatura esta abaixo.... entao a cada loop ele verifica se o sensor esta marcando a temperatura, caso contratio desliga tudo e me alerta.

Isto parece-me estranho... tens a certeza que a funcão de leitura não retorna um erro se tirares a ligacão do sensor? Só dá zero? Se bem me lembro no interface one wire, havia um handshake que dava para entender se o sensor estava ligado ou não.
Podes tirar os if antes do while já que estás a chamar a mesma funcão e assim o programa também trava ali.



Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá também estou montando um controle para aquário e estou tendo o mesmo problema, depois de algumas horas ligado está imprimindo lixo no LCD, porém o meu relay shield tem sim optoacopladores mas mesmo assim depois de um tempo aparece lixo no LCD. Eu li todos os comentários desse tópico mas parece que não foi identificado uma solução, queria compartilhar que tenho o mesmo problema e estou em busca de ma solução
Logged

Pages: 1 ... 6 7 [8] 9   Go Up
Jump to: