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
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por