Boa noite galera. Olha eu aqui de novo.

Vamos a mais hum projetinho e se der tudo certo depois passamos ele para os finalizados:

Bom, não fiquei contente com o meu Arduino e o Nokia 5510. Embora ficou um visual bonito não gostei da leitura em relação a dois termometros digitais que comprei da china e que parecem estar coerente um com o outro na leitura.

Mais vamos lá.

O circuito:

o código:

#include "SevSeg.h"

SevSeg sevseg;

int tempUnits = fahrenheit; //which unit of temperature do you prefer?

int refreshTime = 5000; //how many seconds should it wait before it checks and displays the temp again? 1000 = 1 second

unsigned long timer;
float celsius = 0, kelvin = 0, fahrenheit = 0;

void setup()
{
sevseg.Begin(0,2,3,4,5,6,7,8,9,10,11,12,13);
}

void loop()
{
sevseg.PrintOutput();

//Reads the input and converts it to Kelvin degrees
kelvin = analogRead(0) * 0.004882812 * 100;

//Converts Kelvin to Celsius minus 2.5 degrees error
celsius = kelvin - 2.5 - 273.15;

//Converts Celsius to Fahrenheit minus 2.5 degrees error
fahrenheit = ((kelvin - 2.5) * 9 / 5) - 459.67;

unsigned long mils=millis();
if (mils-timer>=refreshTime) {
timer=mils;
//Print teperature to the displays
sevseg.NewNum(tempUnits,(byte) 2);
 

 }

 No site fala que para trocar o display de catodo comum para anodo comum basta só substituir o 0 para 1 na linha:

sevseg.Begin(0,2,3,4,5,6,7,8,9,10,11,12,13); // código para comum catodo

sevseg.Begin(1,2,3,4,5,6,7,8,9,10,11,12,13); // código para comum anodo 

Até aí tudo bem;

Se tentar compilar o código :

 

Diz também que se quiser trocar de fahrenheit para graus celsius devemos fazer o seguinte:

Trocas as linhas:

int tempUnits = fahrenheit;

para: 

int tempUnits = celsius;

após substituir :

int refreshTime = 5000;

to:

int refreshTime = <however many seconds you want it to wait before updating * 1000>; 

Claro o erro dá o mesmo:

Como sabem meu nível de programação não é legal, por isso venho pedir-lhes ajuda.

Como já falado, após compilado irei montar no proto, fazer o vídeo, postar o esquema em jpg, fritzen e pdf e postar o código ajeitado.

Valeu

José Antonio 

 

Exibições: 2090

Responder esta

Respostas a este tópico

Observando essa primeira parte do codigo

#include "SevSeg.h"

SevSeg sevseg;

int tempUnits = fahrenheit; //which unit of temperature do you prefer?

int refreshTime = 5000; //how many seconds should it wait before it checks and displays the temp again? 1000 = 1 second

unsigned long timer;
float celsius = 0, kelvin = 0, fahrenheit = 0;

podemos ver que é declarado a variavel tempUnits e atribuido a ela o valor da variavel fahrenheit, porem, essa variavel só é criada depois, portanto não é possivel atribuir esse valor a tempUnits.

O que você pode tentar fazer é declarar primeiro as variaveis celsius e fahrenheit pra depois declarar tempUnits, porem, se for utilizar apenas o valor de celcius, basta utilizar o codigo abaixo

#include "SevSeg.h"

SevSeg sevseg;

int refreshTime = 5000; //how many seconds should it wait before it checks and displays the temp again? 1000 = 1 second

unsigned long timer;
float celsius = 0, kelvin = 0;

void setup()
{
sevseg.Begin(0,2,3,4,5,6,7,8,9,10,11,12,13);
}

void loop()
{
sevseg.PrintOutput();

//Reads the input and converts it to Kelvin degrees
kelvin = analogRead(0) * 0.004882812 * 100;

//Converts Kelvin to Celsius minus 2.5 degrees error
celsius = kelvin - 2.5 - 273.15;

unsigned long mils=millis();
if (mils-timer>=refreshTime) {
timer=mils;
//Print teperature to the displays
sevseg.NewNum(celsius,(byte) 2);
 

 }

Veja que eu simplesmente retirei a variavel fahrenheit e sua atribuição, depois mudei o paramento do sevseg de tempUnits para celsius, acredito que funcionará.

Boa noite João.

Obrigado pela resposta. Ao menos agora não dá erro, amanhã vou testar no proteus com o simulino e no proto e depois posto aqui o resultado.

Mais uma vez obrigado pela presteza.

José Antonio 

Bom dia pessoal.

João e cia ltda o termômetro sofreu alguns ajustes. A multiplexação é perfeita nem se nota a varaição dos displays. Com o código anterior ele apresentava 53 graus (meu outro termometro marcava no instante 23 graus), resolvi então tirar a parte da conversão de graus Kelvin para celsius. Até beleza, mais agora ele precisa do ajuste final e que está me deixando intrigado. o termozezinho (será batizado assim) fica 5 segundos apagado (é devido ao int refreshTime = 5000) alterei para 5 não prestou, fui aumentando ele de tempo em tempo apaga os display e volta com a nova leitura. O termometro em relação a fórmula parece estar coerente 23 aqui dentro e 24 lá fora, depois vou colocar um ao lado do outro para ver o que acontece.

Bom pessoal preciso ajustar este apagão dele, deixar ele com leitura direta. No aguardo e contribuição de vocês.

Segue o código:

#include "SevSeg.h"
SevSeg sevseg;
int refreshTime = 5000; //how many seconds should it wait before it checks and displays the temp again? 1000 = 1 second
unsigned long timer;
float celsius = 0;

void setup()
{
sevseg.Begin(1,2,3,4,5,6,7,8,9,10,11,12,13);
}
void loop()
{
sevseg.PrintOutput();

//Reads the input and converts it to Kelvin degrees
celsius = analogRead(0) * 0.004882812 * 100;

//Converts Kelvin to Celsius minus 2.5 degrees error

unsigned long mils=millis();
if (mils-timer>=refreshTime) {
timer=mils;
//Print teperature to the displays
sevseg.NewNum(celsius,(byte) 2);

}
}

Galera, boa tarde novamente,

pude perceber que se ligar uma fonte externa (bateria 9V) no Arduino o apagão citado acima não ocorre. 

Teria o porque baseado em alguma coisa do programa ? 

Está tendo uma diferença de 1 grau celsius em relação ao meu termometro.

No aguardo, 

tks

José resolvi essa diferença colocando um capacitor eletrolítico de 10uF 16v com o negativo no gnd e o positivo no pino analógico do sensor (no meu caso foi o LM35DZ), parece que tem alguma coisa haver com a resistência gerada pelo circuito na hora da leitura. Dica do Ricardo Pedroso, funcionou que uma beleza para mim.

o código final que utilizei foi esse, dei uma simplificada nele para gastar menos processamento conforme recomendações de outros fóruns:

// codigo leitura lm35

int pinoSensor = 0;
int valorLido = 0;
float temperatura = 0;

void setup() {
Serial.begin(9600);
}

void loop() {
valorLido = analogRead(pinoSensor);
double temperatura = (valorLido * 0.48875);

Serial.print("Temperatura atual: ");
Serial.println(temperatura);
delay(1000);
}

Obviamente no meu projeto não havia display.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço