Go Down

Topic: Primer proyecto con Arduino: Invernadero automatizado (Read 6201 times) previous topic - next topic

Mazis

#15
Sep 01, 2013, 01:34 pm Last Edit: Sep 01, 2013, 01:38 pm by Mazis Reason: 1
Quote
ifndef, define e include son en minúsculas (supongo que en tu sketch están bien y las has puesto en mayúsculas al transcribir, pero por si acaso).

Pues no.. XD no estaban en mayusculas, he arreglado un poco lo que me dices, pero ahora me salta este otros error... "expected constructor, destructor, or type conversion before string constant" no lo entiendo, en realidad no entiendo nada...  :smiley-fat:
Estoy empezando a pensar que tal vez no haya sido muy  buena idea eso de las librerias...

EDITO: Supongo que si creo diferentes sketch luego podran comunicarse entre ellos, es correcto? O me olvido de librerias y mierdas y lo hago en el mismo skecth todo?

noter

#16
Sep 02, 2013, 12:46 am Last Edit: Sep 02, 2013, 12:48 am by noter Reason: 1
No desesperes, hombre, que vas por buen camino ;). Ahora tal vez no; pero si tu código se va haciendo más grande, agradecerás el haber comenzado el programa de forma estructurada.
Te paso el código de tu penúltimo post ligeramente modificado, aunque ahora mismo me da error de variable no definida; pero funcionando la inclusión de la librería:

Archivo del proyecto (vacío, sólo he declarado un objeto de tu clase):
Quote

# include "Temperatura.h"

Temperatura miTemperatura(1,2,3);
void setup() {
 // put your setup code here, to run once:

}

void loop() {
 // put your main code here, to run repeatedly:
 
}



Temperatura.h
Quote

//Temperatura.h

#ifndef Temperatura_h
#define Temperatura_h

class Temperatura{
 public:
   Temperatura(int pinLM35, int pinRPotencia, int pinVentilador);
   int calcularTemperatura();
   void mostrarTemperaturaSerial(int temp);
   void controlTemperatura(int temp);
 private:
   int _pinLM35;
   int _pinRPotencia;
   int _pinVentilador;
}; // ¡OJO AL PUNTO Y COMA!

#endif



Temperatura.cpp
Quote

#include "Arduino.h"
#include <Temperatura.h>

Temperatura::Temperatura(int pinLM35, int pinRPotencia, int pinVentilador){
 _pinLM35=pinLM35;
 _pinRPotencia=pinRPotencia;
 _pinVentilador=pinVentilador;
}

int Temperatura::calcularTemperatura(){
 //Calcular temperatura con un LM35:
 return (analogRead(_pinLM35))*500/1024;;
}
void Temperatura::mostrarTemperaturaSerial(int temp){
 Serial.println("Temperatura: ");
 Serial.print(temp);
 Serial.println(" grados C");
}  
 
void Temperatura::controlTemperatura(int temp){
   if(temp>=tempReferencia + 5){        //Histeresis de 5ºC
   digitalWrite(_pinVentilador, HIGH);
   if(digitalRead(_pinRPotencia)==HIGH){
     digitalWrite(_pinRPotencia, LOW);
   }
 }else if(temp<=tempReferencia-5){ // ERROR: tempReferencia no está definida.
    digitalWrite(_pinRPotencia, HIGH);
    if(digitalRead(_pinVentilador)==HIGH){
       digitalWrite(_pinVentilador, LOW);
    }
 }else if(temp==tempReferencia){
   digitalWrite(_pinVentilador, LOW);
   digitalWrite(_pinRPotencia, LOW);
 }


Mazis

Tenia esperanzas de que funcionara o diera menos fallos pero visto lo visto... voy a volver a mi plan inicial y a poner comentarios para cada linea si hace falta para no liarme.

He ido buscando el material que necesito por internet y la semana que viene comprare todo lo necesario para empezar a probarlo... He decido cambiar la manera de calentar/enfriar, el problema que tenia era que no sabia diseñar a pequeña escala un sistema que me enfriara el invernadero, pero por casualidades de la vida, he dado con las celulas peltier, que calientan y enfrian, cambiando solo la polaridad de la corriente(mejor imposible). He pensado que para controlarlo podria usar dos salidas analogicas y dependiendo de si quiero calentar o enfriar, poner una a low y la otra a high y viceversa, esto supongo que es posible no?
Tambien he dado con la solucion para aumentar la humedad, un transductor de ultrasonidos, que hace evaporar el agua de, por ejemplo, un vaso.

En cuanto haga avances con el codigo lo ire posteando por aqui, hasta entonces... Saludos

Mazis

#18
Sep 04, 2013, 02:20 pm Last Edit: Sep 04, 2013, 02:22 pm by Mazis Reason: 1
Estoy aqui de nuevo, he avanzado un poco y he programado un sistema para darle ordenes por el puerto serie, yo creo que funciona pero no me deja compilar porque me da errores en otra parte y no se como solucionarlo... Ya he pedido las celulas peltier y hoy o mañana me deberian llegar ya, he pensado en comprar una shield para arduino con varios reles(esta: http://www.bricogeek.com/shop/shields-arduino/338-arduino-relay-shield.html) alguno la ha probado? funciona bien o no merece la pena?
Otra cosa que me gustaria incorporarle es mandarle las ordenes por bluetooth, pero no se que hay que conectar al arduino para que reciba las ordenes, supongo que un modulo bluetooth, pero no estoy seguro al 100% y como los que he visto son bastante caros, no quiero jugarmela a gastarme una pasta para tenerlo de adorno en mi cuarto...
Aqui les dejo el codigo que tengo hasta ahora, aunque habria que cambiar lo de las resistencias de potencia y los ventiladores, es una tontada que en un segundo se puede corregir...
Code: [Select]

const int pinLM35 = 0;
const int pinVentilador = 2;
const int pinRPotencia = 4;

const int tempReferencia = 25;

int tempC1, tempC2 = 0;
const long tiempoActualizaTemperatura = 10000;
unsigned long tiempoTranscurrido;
long anteriorMilis = 0;

boolean finOrden=false;
int numPalabras=1;
int asciiLeido=0;
char letraLeida=0;
String palabra="";
String orden1="";
String orden2="";

void setup(){
  Serial.begin(9600);
  pinMode(pinLM35, INPUT);
  pinMode(pinVentilador, OUTPUT);
  pinMode(pinRPotencia, OUTPUT);
}

void loop(){
  //tiempoTranscurrido = millis();
  //if(tiempoTranscurrido-anteriorMilis>tiempoActualizaTemperatura){
    //tempC1=calcularTemperatura();
    //}
    while(Serial.available()>0){
      orden1=leerPalabra();
      if(numPalabras==2){
        orden2=leerPalabra();
      }
      if(finOrden==true){
        iterpretarOrden(orden1, orden2);
        orden1="";
        orden2="";
      }
    }
}

int calcularTemperatura(){
  //Calcular temperatura con un LM35:
  return (analogRead(pinLM35))*500/1024;;
}
 
void mostrarTemperaturaSerial(int temp){
  Serial.println("Temperatura: ");
  Serial.print(temp);
  Serial.println(" grados C");

 
void controlTemperatura(int temp){
    if(temp>=tempReferencia + 3){        //Histeresis de 3ºC
    digitalWrite(pinVentilador, HIGH);
    if(digitalRead(pinRPotencia)==HIGH){
      digitalWrite(pinRPotencia, LOW);
    }
  }else if(temp<=tempReferencia-3){
     digitalWrite(pinRPotencia, HIGH);
     if(digitalRead(pinVentilador)==HIGH){
        digitalWrite(pinVentilador, LOW);
     }
  }else if(temp==tempReferencia){
    digitalWrite(pinVentilador, LOW);
    digitalWrite(pinRPotencia, LOW);
  }
}

String leerPalabra(){
  palabra="";
  while(Serial.available()>0){
    asciiLeido=Serial.read();
    if(asciiLeido!=10 && asciiLeido!=13 && asciiLeido!=32){    //13=retorno de carro, 10=salto de linea , 32=espacio
      palabra=palabra+asciiLeido;
    }else if(asciiLeido==32){                                  //Si hay un espacio devuelve la plabra en mayusculas y aumenta numPalabras
      numPalabras++;
      return palabra.toUpperCase();
    }else if(asciiLeido==10){                                  //Si presionamos enter ya no hay mas que leer y devuelve la palabra en mayusculas
      finOrden=true;
      Serial.flush();
      return palabra.toUpperCase();
    }
  }
}

void iterpretarOrden(String palabra1, String palabra2){
  if(palabra1=="MOSTRAR"){
    if(orden2=="TEMPERATURA"){
      mostrarTemperaturaSerial(calcularTemperatura());
    }else if(palabra2=="HUMEDAD"){
      mostrarHumedadSerial(calcularHumedad());
  }

 


El error me salta al hacer palabra.toUpperCase(); en el metodo leerPalabra... Creo que puede ser porque no puedo llamar al metodo toUpperCase() en la sentencia return, pero no estoy seguro la verdad...

Mazis

Sigo adelante con mi proyecto... Y tambien sigo con la misma duda que tenia la ultima vez que actualice el post. Alguien sabe porque me salta error en el palabra.toUpperCase(); ?
Ya me han llegado la shield con los reles y el modulo bluetooth para comunicarme con el arduino usando bt... Tambien he comprado el invernadero y he empezado a plantar, por ahora poca cosa ya que tengo que encontrar un macetero del tamaño que necesito, me gustaria que me echarais una mano con el error que me salta para poder meterle el codigo al arduino y empezar a controlar el invernadero.

Gracias a todos.

davidvg

Hola, si puedes pegar el error que te da sería más fácil intentar saber qué ocurre ;)

Esto debería funcionar:
Code: [Select]

#include <string>
using std::string;

Ahora mismo no caigo en si el IDE de Arduino admite este código (no lo uso); si no, puedes crear un archivo externo e incluirlo con #include.

Mazis


Hola, si puedes pegar el error que te da sería más fácil intentar saber qué ocurre ;)

Esto debería funcionar:
Code: [Select]

#include <string>
using std::string;

Ahora mismo no caigo en si el IDE de Arduino admite este código (no lo uso); si no, puedes crear un archivo externo e incluirlo con #include.

Muchas gracias por la ayuda, pero no era nada de lo que yo habia pensado ni tampoco lo que me dices ahi... Es simplemente que soy un poco idiota XD El problema era que el metodo toUpperCase() no devuelve nada y al ponerlo en la sentencia return pues saltaba error... Al menos un problema solucionado, pero no termina ahi la cosa... Ahora que compila, al meterlo al arduino, por lo que sea no quiere leer las ordenes que le doy desde el monitor serie del ide... Alguna idea? El metodo que se encarga de leer lo que entra por el puerto serie es: leerPalabra() y el que comprueba las ordenes es: iterpretarOrden(String palabra1, String palabra2, String palabra3). Aqui os dejo el codigo que tengo:
Code: [Select]

#include "WString.h"

const int pinLM35Interior = 0;
const int pinLM35Exterior = 1;
const int pinVentiladorPeltier = 7;
const int pinPeltier1 = 2;
const int pinPeltier2 = 4;

const int tempReferencia = 25;
/*
int tempC1, tempC2 = 0;
const long tiempoActualizaTemperatura = 10000;
unsigned long tiempoTranscurrido;
long anteriorMilis = 0;
*/
boolean finOrden=false;
int numPalabras=1;
int asciiLeido=0;
char letraLeida=0;
String palabra="";
String orden1="";
String orden2="";
String orden3="";

void setup(){
  Serial.begin(9600);
  pinMode(pinLM35Interior, INPUT);
  pinMode(pinLM35Exterior, INPUT);
  pinMode(pinPeltier1, OUTPUT);
  pinMode(pinPeltier2, OUTPUT);
}

void loop(){
  //tiempoTranscurrido = millis();
  //if(tiempoTranscurrido-anteriorMilis>tiempoActualizaTemperatura){
    //tempC1=calcularTemperatura();
    //}
    if(Serial.available()>0){
      orden1=leerPalabra();
      if(numPalabras==2){
        orden2=leerPalabra();
      }else if(numPalabras==3){
        orden3=leerPalabra();
      }
      if(finOrden==true){
        iterpretarOrden(orden1, orden2, orden3);
        orden1="";
        orden2="";
        orden3="";
        numPalabras=1;
      }
    }   
}

int calcularTemperaturaInt(){
  //Calcular temperatura con un LM35:
  return (analogRead(pinLM35Interior))*500/1024;;
}

int calcularTemperaturaExt(){
  //Calcular temperatura con un LM35:
  return (analogRead(pinLM35Exterior))*500/1024;;
}
 
void mostrarTemperaturaSerial(int temp){
  Serial.println("Temperatura: ");
  Serial.print(temp);
  Serial.println(" grados C");

 
void controlTemperatura(int temp){
    if(temp>=tempReferencia + 3){                      //Histeresis de 3ºC
    digitalWrite(pinVentiladorPeltier, HIGH);
    if(digitalRead(pinPeltier1)==HIGH){                //Enfriar
      digitalWrite(pinPeltier1, LOW);
      digitalWrite(pinPeltier2, HIGH);
    }
  }else if(temp<=tempReferencia-3){
     digitalWrite(pinVentiladorPeltier, HIGH);         //Calentar
     if(digitalRead(pinPeltier2)==HIGH){
      digitalWrite(pinPeltier1, HIGH);
      digitalWrite(pinPeltier2, LOW);
     }
  }else if(temp==tempReferencia){
    digitalWrite(pinVentiladorPeltier, HIGH);          //Apagar
    digitalWrite(pinPeltier1, LOW);         
    digitalWrite(pinPeltier2, LOW);
  }
}

String leerPalabra(){
  palabra="";
  while(Serial.available()>0){
    asciiLeido=Serial.read();
    if(asciiLeido!=10 && asciiLeido!=13 && asciiLeido!=32){    //13=retorno de carro, 10=salto de linea , 32=espacio
      palabra=palabra+char(asciiLeido);
    }else if(asciiLeido==32){                                  //Si hay un espacio devuelve la plabra en mayusculas y aumenta numPalabras
      numPalabras++;
      palabra.toUpperCase();
      return palabra;
    }else if(asciiLeido==10){                                 //Si presionamos enter ya no hay mas que leer y devuelve la palabra en mayusculas
      finOrden=true;
      Serial.flush();
      palabra.toUpperCase();
      return palabra;
    }
  }
}

void iterpretarOrden(String palabra1, String palabra2, String palabra3){
  if(palabra1=="MOSTRAR"){
    if(palabra2=="TEMPERATURA"){
      if(palabra3=="EXTERIOR"){
        mostrarTemperaturaSerial(calcularTemperaturaExt());
      }else if(palabra3=="INTERIOR"){
        mostrarTemperaturaSerial(calcularTemperaturaInt());
      }
    }else if(palabra2=="HUMEDAD"){
      //mostrarHumedadSerial(calcularHumedad());
    }
  }
}


Por cierto me gustaria daros las gracias a todos los que me vais ayudando ya que yo solo dudo que hubiera llegado hasta aqui...

Go Up