LM35 para ligar um LED

Estou tentando fazer com que um LED ligue caso o valor que eu colocar na serial for maior que a temperatura que ele está medindo. O problema é que está ligando sempre. Alguém poderia me ajudar?

const int LM35 = A0;
float temperatura;

void setup() {

Serial.begin(9600);
pinMode(13, OUTPUT);

}

void loop() {

temperatura = (float(analogRead(LM35))*5/(1023))/0.01;

Serial.print("Temperatura: ");
Serial.println(temperatura);
delay(2000);

if(Serial.available() > 0){

if(temperatura <= Serial.read()){
digitalWrite(13, HIGH);
}
else if(temperatura >= Serial.read()){
digitalWrite(13, LOW);
}
}
}

Tens de rever protocolos e o código ascii para perceberes o que tens de fazer.

Basicamente quando mandas 34.0, estás a mandar o character 3, 4, . e 0 separadamente para o Arduino. Esses caracteres estão em ASCII que é um código que podes ver aqui www.asciitable.com.

Pesquisa por protocolos de comunicação (aqui no fórum existem uns poucos) para veres exemplos de como fazer isto.

Eu usei Serial.parseFloat no lugar de Serial.read e funcinou. Pelo que entendi o Serial.parseFloat lê um float na porta serial ao invés do ASCII separado de cada número.

O problema agora é que o programa em C que estou fazendo para mandar estes valores não parece estar comunicando corretamente.

#include <stdio.h>
#include <windows.h>
#include <conio.h>

HANDLE hSerial;
wchar_t port[6] = {L"COM3"};

int main() {

hSerial = CreateFile(“COM3”, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
GetCommState(hSerial, &dcbSerialParams);
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
SetCommState(hSerial, &dcbSerialParams);

COMMTIMEOUTS timeouts = {0};
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
SetCommTimeouts(hSerial, &timeouts);

float comando, temperatura;
int menu;

while (menu != 27){

printf("\n\nQual temperatura você deseja?\n");
scanf("%f", &comando);

float TxBuff [1];
unsigned int TotalBytesaEnviar = 12;
unsigned long BytesEnviados;

TxBuff [0 ] = comando;
WriteFile(hSerial, &TxBuff, TotalBytesaEnviar, &BytesEnviados, NULL);

float RxBuff [1];
unsigned int TotalBytesaReceber = 1;
unsigned long BytesRecebidos;

ReadFile(hSerial, &RxBuff, TotalBytesaReceber, &BytesRecebidos, NULL);

temperatura = RxBuff[0];

printf("\n\nTemperatura atual: %f\n", temperatura);

printf("\n\nTecle ESC para sair. Outra tecla para reiniciar");
menu = getch ();
}

CloseHandle (hSerial);
return 0;
}

Mesmo enviando valores não acontece nada. E a temperatura recebida está errada. Isso é algum problema com o Serial.parseFloat será?

A porta série é a correcta?

A porta série do Arduino está aberta quando testas este programa?

A variável menu tem de ser inicializada com um valor... 0... por exemplo.

A variável comando tem de ser inicializada.

A variável temperatura tem de ser inicializada.

Isto está completamente errado:

      float TxBuff [1];  // um array de 1 float ou 4 bytes. 
      unsigned int TotalBytesaEnviar = 12;  // vais enviar 12 bytes porquê??????
      unsigned long BytesEnviados;

De resto, eu não sou um programador de Windows logo não faço ideia se as funções que chamas estão correctas. Eu não as conheço e não vou ler como funcionam por ti. No entanto, o teu computador está a correr pelo menos 2 cores a uma frequência de GHz... o Arduino está a correr um processador de 8 bits a 20 ou 16MHz...

Quando acabas de enviar os dados, tens de colocar o computador à espera de receber dados de volta durante algum tempo. A comunicação, quando comparada à velocidade do computador é super lenta e se a função ReadFile não bloquear, não vais ler nada.

Já agora, tu não fazes verificação do retorno de função nenhuma no programa... logo é natural que não percebas o que se pode estar a passar.

Lê como funcionam as funções. Coloca um atraso entre enviar e receber dados de volta e acima de tudo vê o que as funções todas retornam para te dar uma indicação de onde está o problema.