Protocolo NE-555: Como mandar um sinal analógico pro Arduino a longas distâncias por meio de fios

Qualquer garagista que já tentou ler um potenciômetro pelo Arduino sabe que esse potenciômetro não pode ficar a mais de 1 metro do microcontrolador, já que a corrente contínua sofre perdas e interferências consideráveis a longas distâncias.

Me deparei com esse problema há uns dois anos, quando o Almir Bispo me sugeriu criar um protocolo com NE-555.

Prá quem não conhece, é um oscilador importantíssimo na eletrônica, através do qual podemos criar disparos programados pelo tempo ou uma onda quadrática (output) cuja frequência pode ser controlada colocando um capacitor variavel em C1 ou um resistor variável em R1 ou R2, como mostra a figura:

Notem que a frequência é inversamente proporcional ao período do ciclo criado, ou seja, F=1/T, em segundos.

O NE-555 pode receber até 18V na entrada. Havendo cerca de 1 Volt de queda dentro do CI, a saída terá 17V. Esticando o fio da saída vários metros haverá uma perda grande na tensão que chegará efetivamente à outra ponta, porém a frequência permanece a mesma!

Então, se tivermos houver uma perda de 2/3 da tensão ao longo do trajeto, ainda assim teremos 6V chegando ao pino de entrada do Arduino. Claro que você não pode colocar 6V num pino digital, ou vai danificar o Arduino.

Mas pode colocar ali um regulador de tensão simples, como LM317, regulado para 4,5 ou 5V (que é a tensão suportada pelo pino digital), apenas para não queimar o Arduino.

Muito bom, mas como transformar a leitura de temperatura de um termistor em pulso de onda e depois em temperatura novamente?

Como vimos no esquema acima, a frequencia da onda é uma função da resistência do termistor (colocado em R1).

F = (1.44) / (C1 * (R1+2*R2)))

Se F = 1/T:

T = C1 * (R1+2*R2)) / 1.44

(1.44 * T) / C1 = R1 + 2*R2

R1 = ((1.44 * T) / C1) - 2*R2

Então assim conhecendo C1 e R2, utilizamos a função PulseIn do Arduino para extrair o valor do período T:

pico = (pulseIn(entrada, HIGH)); // PulseIn retorna o periodo em microssegundos

vale = (pulseIn(entrada, LOW));
periodo = (pico + vale);
periodoS = 1000000*periodo; // converte microssegundos em segundos

e assim processar o valor da resistência do termistor:


R1 = (((1.44*periodoS) - 20000000000)/1000000);

Muito bom! Agora conhecendo o valor da resistência do termistor, podemos encontrar a temperatura dele através da equação reduzida de Steinhart-Hart. Um detalhe é que pesquisei termistores. Existem 2 tipos principais: O NTC é aquele comum, mais barato, porém não permite ler temperaturas muito altas.

Já os termistores PTC são caros, mas permitem leituras de 300 a 400 graus, porém a equação para resolver a curva de temperatura é muito mais complexa e não vale a pena aqui abordar este assunto. Talvez num próximo post.

A equação de SteinHart-Hart reduzida:

Kelvin =  1 / ( (1/To)+((log(R1/Ro))/BETA) );

Onde Kelvin é a temperatura em graus Kelvin e R1 é a resistência do termistor.

(To) é a temperatura de referência, 25 graus Celsius. Neste caso, Kelvin = Celsius + 273.15 = 25 + 273 = 298 graus Kelvin

Ro é a resistência de referência do termistor, a resistência que ele atinge quando está a 25 graus Celsius. Quando falamos "termistor de 10K", quer dizer que a resistência do termistor é 10 K quando a temperatura do ambiente for 25 graus Celsius.

Já o coeficiente BETA é mais chato, mas bem interessante de se encontrar: dificilmente um vendedor vai saber infromá-lo prá você. Você pode encontrá-lo pela fórmula:

Ou experimentalmente, como eu fiz: coloque um termômetro perto do termistor e "chute" que o valor de BETA é 4000. Faça a leitura do termistor pelo Arduino e altere o valor de BETA até que os valores no Arduino e no termômetro da parede estejam o mais próximo possível.

Feito isso, você já deve ter uma leitura muito aproximada da temperatura a grandes distâncias do Arduino. Faça as ligações necessárias:

E escreva o código:


// Desenvolvido por Alexandre Aravecchia
// a.k.a. O Tio do Computador
//http://tiodocomputador.tumblr.com/
// Com o apoio de http://labdegaragem.com/
//Publicado no Labdegaragem em 10/outubro/2016.


#include <LiquidCrystal.h> //Inclui a biblioteca do LCD
#include <math.h>
#include <Arduino.h>
//LiquidCrystal lcd(12,11,5,4,3,2);
//LiquidCrystal lcd(7, 9, 10, 11, 12, 13);
//LiquidCrystal lcd(RS E D4 D5 D6 D7);
//Estes valores quando trabalhar na protoboard
//LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
//Estes valores quando trabalhar no proteus
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//Estes valores quando trabalhar no LCD Keypad

const int entrada = 2; // PulseIn ligado ao pino 2
//const int timeout = 2000000; // um segundo
const int t=500; // tempo de delay
const float BETA = 4000; //Calibrar este valor utilizando um termometro externo como comparacao
const float Ro = 100000; //Resistencia tpica de um termistor de 100k
const float To = 25+273.15;

void setup()
{
Serial.begin(9600);
pinMode(entrada, INPUT_PULLUP);
// pinMode(entrada, INPUT_PULLUP);
// Use INPUT_PULLUP para utilizar o Arduino diretamente no NE-555
//Se o circuito estiver instavel,
// tente usar Pull Up com pinMode(entrada, INPUT); normalmente.

lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2(Colunas x Linhas)
lcd.setCursor(0, 0); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
lcd.print("Protocolo NE-555"); //Escreve no LCD "Olá Garagista!"
lcd.setCursor(0, 1); //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD
lcd.print(" Lab de Garagem "); //Escreve no LCD "LabdeGaragem"
delay(t);
}

void loop()
{
unsigned long pico;
unsigned long vale;
float periodo;
float periodoS;
float R;
float Kelvin;
float Celsius = Kelvin-273;

pico = (pulseIn(entrada, HIGH)); // PulseIn retorna o periodo em microssegundos
vale = (pulseIn(entrada, LOW));
periodo = (pico + vale);
periodoS = 1000000*periodo; // converte microssegundos em segundos.

R = (((1.44*periodoS) - 20000000000)/1000000);

Kelvin = 1 / ( (1/To)+((log(R/Ro))/BETA) );


Celsius = Kelvin-273; // Convert Kelvin to Celsius

if (periodo)
{
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("R =");
lcd.setCursor(4, 0);
lcd.print(R, 0);
lcd.print(" Ohm");

lcd.setCursor(0, 1);
lcd.print("T =");
lcd.setCursor(4, 1);
lcd.print(Celsius, 2);
// lcd.setCursor(8, 1);
lcd.print(" Celsius");
}
// lcd.clear();
delay(t);
}

Exibições: 927

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço