Go Down

Topic: Combining sketches on my project "Weather station" (Read 820 times) previous topic - next topic

Acachinero

Hola que tal!

Estoy llevando a cabo la realizacion de una estacion meteorologica usando Arduino Uno. Debo emplazar mi proyecto en el campo para medir precipitacion (utilizando a rain gauge), temperatura por encima y por debajo del suelo (usando dos DS18B20 waterproof) y humedad-temperatura ambiente (usando DHT-22). Usare un Adafruit data logging shield con RTC y SD Card (para almacenar los datos) y una LCD Nokia 5110 para visualizarlos in situ. La fuente de alimentacion del proyecto aun no la tengo muy clara.

Yo trabajo como ingeniero de montes en Dublin asi que no tenia mucha idea sobre programacion y electronica. A dia de hoy se puede decir que estoy bastante familiarizado con el tema tras haber estudiado sobre ello y visto bastantes videos. He conseguido obtener las instalaciones fisicas de todos los componentes integrados y los sketches para cada uno de ellos pero en este caso por separado (sketch) mi problema viene cuando empiezo a combinarlos. He seguido varios tutoriales pero sin suerte hasta la fecha y la verdad es que me esta costando bastante dar con la solucion de como combinarlos para que funcionen en uno solo.


El primer caso que me da error es al intentar combinar el rain gauge (para medir precipitacion) con los dos termometros DS18B20. El sketch union de los dos se carga correctamente en el Arduino software pero cuando quiero leer en el serial monitor solo me aparecen datos de temperatura y nada cuando balanceo las cubetas que colectan la lluvia y mandan la senal al reed switch situado en el rain gauge.

El primer sketch corresponde al rain gauge (funciona correctamente tal cual):

Code: [Select]
int REED = 9;     //The reed switch outputs to digital pin 9
int val = 0;            //Current value of reed switch
int old_val = 0;        //Old value of reed switch
int REEDCOUNT = 0;      //The intial count is zero



void setup(){

 Serial.begin(9600);
 pinMode (REED, INPUT_PULLUP); //This activates the internal pull up resistor

}


void loop(){

 val = digitalRead(REED);      //Read the status of the Reed swtich
 if ((val == LOW) && (old_val == HIGH)){    //Check to see if the status has changed


   Serial.print ("Precipitation = ");
   REEDCOUNT = REEDCOUNT + 9.5;   //Add 9.5 to the count of bucket tips
   old_val = val;              //Make the old value equal to the current value
   Serial.print(REEDCOUNT);  //Output the count to the serial monitor
   Serial.println (" ml of rain");

 }

 else {
   old_val = val;              //If the status hasn't changed then do nothing
}



Este segundo sketch corresponde a la instalacion de dos termometros resistentes al agua (DS18B20) el cual solo me marca las variables de uno de los termometros. Yo creo que debo usar una resistencia mayor de unos 100-120 ohms cuando combino varios termometros en paralelo???

Code: [Select]
#include <OneWire.h>

OneWire  ds(2);  // on pin 2 (a 4.7K resistor is necessary)/ check with 120 ohms for reading multiple temp sensors.

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(2000);
    return;
  }
 
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}


Estaria muy agradecido si me pudieses indicar como debo combinar los sketches o en que estoy fallando.

Muchas gracias.

En la imagen se puede ver la conexion del rain gauge y los dos termometros con arduino.

Acachinero

I have got the info! thanks to you all anyway!!!

Go Up