Go Down

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

bubulindo

Parabéns! Está bacano.

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

lmeireles43

ontem observei que o relogio também entra em pane mas com muito menos frequencia, vai a 45 horas :P 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] << 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);
                     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;
                    }
}

bubulindo

Boas.

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

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

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

lmeireles43

#113
Feb 09, 2013, 03:24 pm Last Edit: Feb 09, 2013, 04:22 pm by lmeireles43 Reason: 1
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?

lmeireles43

deu uma olhada no script hugo?

Go Up