Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Pages: [1]   Go Down
Author Topic: Pequeño problema con puerto serie  (Read 1737 times)
0 Members and 1 Guest are viewing this topic.
Foz- Lugo
Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos! Estoy practicando la comunicación de Arduino con el portátil y me he decidido a hacer un programilla en visual basic 6.0 en el que muestro la temperatura que leo con Arduino desde la entrada A0 con un sensor de temperatura tipo termistor de 1K (Las medidas no son exactas porque tengo que buscar los valores de las resistencias para las formulas, pero mas o menos es casi la temperatura buena). Bueno el problema no es ese, el problema que tengo es que además estoy probando a encender y apagar el led 13 desde el visual basic, para encenderlo funciona bien, pero para apagarlo tengo que hacer varias pulsaciones sobre el botón, os pongo todo y a ver si me podeis ayudar.

Aquí os pongo el codigo para el Arduino:

Code:
#include <stdio.h>
#include <math.h>

float Vin=5;  //Voltaje Entrada
float Raux=1000; //Resistencia auxiliar para calcular la temperatura en ohm
float R0=1000;  //Resistencia ntc en ohm
float Ti=293.15;  //Temperatura a 25ºC en grados Kelvin

float Vout=0.0;    // [V]        Tension de salida del divisor de tension
float Rout=0.0;    // [ohm]      Resistencia de la NTC

float T1=273;      // [K]        Temperatura a 0ºC en grados Kelvin
float T2=373;      // [K]        Temperatura a 100ºC en grados Kelvin
float RT1=1975;   // [ohms]     Resistencia a 0ºC
float RT2=215;    // [ohms]     Resistencia a 100ºC

float beta=0.0;    // [K]        parametro Beta
float Rinf=0.0;    // [ohm]      Parametro Rinf
float TempK=0.0;   // [K]        Temperatura de salida en kelvin
float TempC=0.0;   // [ºC]       Temperatura de salida en grados Centigrados


void setup() {
  //Definimos la velocidad de transferencia a 9600 baudios
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  beta=(log(RT1/RT2))/((1/T1)-(1/T2));
  Rinf=R0*exp(-beta/Ti);

}

void loop() {
  Vout=Vin*((float)(analogRead(0))/1024.0);
  Rout=(Raux*Vout/(Vin-Vout));
  TempK=(beta/log(Rout/Rinf));
  TempC=TempK-273.15;
  Serial.println(TempC);  //Mandamos el valor obtenido por el sensor analogico a traves del puerto serie
  if (Serial.read()== '1')
  {
    digitalWrite(13,HIGH);
  }
  else if (Serial.read()== '2')
  {
     digitalWrite(13,LOW);
   }
  delay(1000);
}

Aquí os pongo una imagen del programa:



Y este es el programa en visual basic:

Code:
Option Explicit

Dim Temperatura As Double
Private Sub cmdConectar_Click()
    Serie.PortOpen = True
    Timer1.Enabled = True
    cmdON.Enabled = True
    cmdOFF.Enabled = True
End Sub

Private Sub cmdDesconectar_Click()
    Timer1.Enabled = False
    Serie.PortOpen = False
End Sub

Private Sub cmdOFF_Click()
    Serie.Output = "2"
End Sub

Private Sub cmdON_Click()
    Serie.Output = "1"
End Sub

Private Sub Timer1_Timer()
    Temperatura = Val(Serie.Input)
    If Temperatura <> 0 Then
        txtTemp.Text = Temperatura
        If Temperatura < txtMin.Text Then
            txtMin.Text = Temperatura
        ElseIf Temperatura > txtMax.Text Then
            txtMax.Text = Temperatura
        End If
    End If
End Sub
Logged


Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prueba a cambiar esta parte:

Code:
if (Serial.read()== '1')
  {
    digitalWrite(13,HIGH);
  }
  else if (Serial.read()== '2')
  {
     digitalWrite(13,LOW);
   }

por esta otra:

Code:
while (Serial.available()){
  byte dato = Serial.read();
  switch (dato){
    case '1':
      digitalWrite(13,HIGH);
      break;
    case '2':
      digitalWrite(13,LOW);
      break;
  }
}

No creo que cambie mucho la cosa, pero por probar...
« Last Edit: February 22, 2011, 02:40:06 am by chiva » Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Foz- Lugo
Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

He probado como me pusiste chiva y me ha funcionado perfecto, ahora la duda es lo de serial.avaliable() y porque declaramos dato como byte y no como tipo texto. gracias por contestar
« Last Edit: February 21, 2011, 07:47:26 pm by Regata » Logged


Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dato es de tipo 'byte' porque devuelve un byte, sin más. Si quieres ponerlo como 'char' o 'unsigned char' también funcionaría.

Serial.available() te devuelve la cantidad de datos que ha recibido Arduino por el puerto serie, asi que mientras haya alguno se procesan y luego ya se continua con el programa.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Pages: [1]   Go Up
Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Jump to: