Go Down

Topic: LM35 para ligar um LED (Read 1 time) previous topic - next topic

jbiribi

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);
  }
}
}

bubulindo

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.
This... is a hobby.

jbiribi

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.

jbiribi

#3
Dec 08, 2017, 07:33 am Last Edit: Dec 08, 2017, 07:50 am by jbiribi
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á?

bubulindo

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:

Code: [Select]

      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.
This... is a hobby.

Go Up