You are on page 1of 4

/*Omimetro

Definies
X = resistor a descobrir
V = 5V volts arduino
R = resistor fixo
Vx = tenso A0
Pin10 = primeiro digito
Pin11 = segundo digito
Pin12 = terceito digito
Pin12 = quarto digito
*/

#define V 4.951
#define R 268.6
#define tempo 3

int X = 0;
float Vx = 0 ;

int milhar = 0;
int centena = 0;
int dezena = 0;
int unidade = 0;

float analog = 0;
long acumulador = 0;
int numeroAmostras = 0;
float analogFiltro = 0;

signed int mul1, mul2, divide, result, temp; // registradores temporarios para
calculo
signed long bigvar; // variavel temporaria para calculo

const int conver[9] = { 928, 903, 874, 841, 803, 762, 718, 671, 623};
const int temper[9] = { 0, 50, 100, 150, 200, 250, 300, 350, 400};

byte seven_seg_digits[16][7] = {
{ 0, 0, 0, 0, 0, 0, 1 }, // = Digito 0
{ 1, 0, 0, 1, 1, 1, 1 }, // = Digito 1
{ 0, 0, 1, 0, 0, 1, 0 }, // = Digito 2
{ 0, 0, 0, 0, 1, 1, 0 }, // = Digito 3
{ 1, 0, 0, 1, 1, 0, 0 }, // = Digito 4
{ 0, 1, 0, 0, 1, 0, 0 }, // = Digito 5
{ 0, 1, 0, 0, 0, 0, 0 }, // = Digito 6
{ 0, 0, 0, 1, 1, 1, 1 }, // = Digito 7
{ 0, 0, 0, 0, 0, 0, 0 }, // = Digito 8
{ 0, 0, 0, 1, 1, 0, 0 }, // = Digito 9
{ 0, 0, 0, 1, 0, 0, 0 }, // = Digito A
{ 1, 1, 0, 0, 0, 0, 0 }, // = Digito B
{ 0, 1, 1, 0, 0, 0, 1 }, // = Digito C
{ 1, 0, 0, 0, 0, 1, 0 }, // = Digito D
{ 0, 1, 1, 0, 0, 0, 0 }, // = Digito E
{ 0, 1, 1, 1, 0, 0, 0 } // = Digito F
};

void Calcula_Temperatura()
{
int n, intervalo;
int adlo, adhi, vallo, valhi;

// (resultado no registrador "ad")


for (n = 1; n < 9; n++) { // acha intervalo na curva de temperatura mapeada
if (analogFiltro < (int) conver[n]) {
intervalo = n;
break;
}
else intervalo = 35;
}
adhi = conver[intervalo]; // recupera valores a partir das curvas
mapeadas
adlo = conver[intervalo - 1];
valhi = temper[intervalo];
vallo = temper[intervalo - 1];

mul1 = (int) analogFiltro - adlo; // prepara registradores para calculo a


partir
mul2 = vallo - valhi; // da curva mapeada (regra de tres)
divide = adlo - adhi;

// calcula curva mapeada


bigvar = (long) mul1 * (long) mul2;
bigvar /= (long)divide;
result = (int) bigvar; // resultado

result += vallo;

temp = result;

Serial.print("intervalo = ");
Serial.println(intervalo);
delay(100);

Serial.print("adhi = ");
Serial.println(adhi);
delay(100);

Serial.print("adlo = ");
Serial.println(adlo);
delay(100);

Serial.print("valhi = ");
Serial.println(valhi);
delay(100);

Serial.print("vallo = ");
Serial.println(vallo);
delay(100);
}
void magica (int digito, int numero) { // Funo para ligar o display e montar o
valor

digitalWrite(digito, HIGH);
int pin = 2;
for (int n = 0; n < 7; n++) { // varre matriz e liga os seguimentos para formar o
digito
digitalWrite(pin, seven_seg_digits[numero][n]);
pin++;

}// end for


delay(tempo);
digitalWrite(digito, LOW);

}// end magica

void decompNumeros() {// Funo que decompoe o mumero inteiro Ex: 1234 - (1)-
milhar, (2)-centenas, (3)-dezenas, (4)-unidades
milhar = temp / 1000;
centena = temp / 100;
dezena = (temp - (centena * 100) ) / 10;
unidade = (temp - ( (centena * 100) + (dezena * 10)));

//sempre que um valor for superior a "9" receber o valor "0".


if (milhar > 9) {
milhar = 0;
}
if (centena > 9) {
centena = 0;
}
if (dezena > 9) {
dezena = 0;
}
if (unidade > 9) {
unidade = 0;
}

}//end decompNumeros

void filtroAmostras() { // Funo que ira calcular uma amostra de leituras da A0, a
quantidade de amostras definida no "if"
//esta funo torna mais estvel a exibio no display
if (numeroAmostras < 10) {
analog = analogRead(A0);
acumulador = acumulador + analog;
numeroAmostras++;
} else {
analogFiltro = acumulador / numeroAmostras;
numeroAmostras = 0;
acumulador = 0;
}//end if-else
}//end filtroAmostras

void setup() {
Serial.begin(9600);
for (int n = 2; n <= 14; n++) {// Declara que os pinos de 2 a 13 so sadas
pinMode(n, OUTPUT);
}
for (int n = 2; n < 8; n++) { // Passa os pinos 2 a 7 para nvel alto, display da
linha E liga com nvel lgico baixo
digitalWrite(n, HIGH);
}
for (int n = 10; n < 14; n++) {// Passa todos os comuns para nvel baixo
digitalWrite(n, LOW);
}

void loop() {
filtroAmostras();
/******calculo da resistncia medida*******/
/**/ Vx = (V * (analogFiltro / 1023));/**/
/**/ X = (((V * R) / Vx) - R); /**/
/***************************************/
Calcula_Temperatura();
decompNumeros();

long timer = 0;
timer = millis();

Serial.print("temp = ");
Serial.println(temp );

if ( millis() - timer < 300) {// atualiza display a cada 300ms


/*Sequncia de testes para desligar digitos no utilizados*/
if (milhar != 0) {
magica(10, milhar);
}
if (centena != 0 || X >= 1000) {
magica(11, centena);
}
if (dezena != 0 || X >= 100) {
magica(12, dezena);
}
magica(13, unidade);
}
}

You might also like