Go Down

Topic: Seguimiento fermentación levaduras con sensor MQ135 y DS18B20, unir dos sensores (Read 390 times) previous topic - next topic

bttpetres

Hola compañeros.
Os escribo porque estoy intentado hacer un proyecto escolar en el que utilizamos Arduino para hacer un estudio de la fermentación alcohólica que lleva a cabo la levadura del pan. Es un proyecto STEM para implementar en las aulas de secundaria.
El tema es que utilizo el sensor DS18B20 para medir la Tª de la solución que lleva la levadura con los nutrientes (concentraciones conocidas y controladas, etc.) y el DS18B20 por otro lado me da la Tª real de la mezcla de fermentación. Conecto el recipiente y la cámara donde está el sensor (una fiambrera herméticamente cerrada), y de ella los cables al arduino.
Se utilizar cada sensor por separado, y me da los datos adecuados, pero no se como combianr los dos códigos para poder utilizar una única placa.

El sensor es el MQ135 porque aunque es un sensor de gases, no específico, me sirve para hacer un seguimiento de la velocidad de la fermentación (en la que se produce alcohol, CO2, ..). No necesito la precisión de un sensor MG811 o específico de CO2, solo es para comparar el efecto que tiene la Tª (o otros posibles aditivos químicos) en la producción de alcohol y gases de la fermentación.

Os adjunto los códigos de los dos sensore y espero que alguien me sepa ilustrar para obtener un código único. (un único sketch).

Saludos y gracias por vuestras maravillosas ideas y aportaciones.



Code: [Select]
DETECCIÓN DE LA FERMENTACIÓN EN PPM DE CO2 (y más gases que influyen)

#include <MQ135.h>

#include <MQ135.h>

// The load resistance on the board
#define RLOAD 1.0
// Calibration resistance at atmospheric CO2 level
#define RZERO 76.0
#include "MQ135.h"
MQ135 gasSensor = MQ135(A6);
int val;
int sensorPin = A6;
int sensorValue = 0;
void setup() {
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);
}

void loop() {
  val = analogRead(A6);
  Serial.print ("raw = ");
  Serial.println (val);
  float zero = gasSensor.getRZero();
  Serial.print ("rzero: ");
  Serial.println (zero);
  float ppm = gasSensor.getPPM();
  Serial.print ("ppm: ");
  Serial.println (ppm);
  delay(1000);
}

DS18B20/code] Medición de la Tª
#include <MQ135.h>

#include <MQ135.h>

// The load resistance on the board
#define RLOAD 1.0
// Calibration resistance at atmospheric CO2 level
#define RZERO 76.0
#include "MQ135.h"
MQ135 gasSensor = MQ135(A6);
int val;
int sensorPin = A6;
int sensorValue = 0;
void setup() {
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);
}

void loop() {
  val = analogRead(A6);
  Serial.print ("raw = ");
  Serial.println (val);
  float zero = gasSensor.getRZero();
  Serial.print ("rzero: ");
  Serial.println (zero);
  float ppm = gasSensor.getPPM();
  Serial.print ("ppm: ");
  Serial.println (ppm);
  delay(1000);
}


adjunto los dos archivos ino por separado.

Muchas gracias y saludos.


surbyte

Para trabajar con los DS18B20 debes usar dos librerías OneWire y DallasTemperature si mal recuerdo. Los ejemplos tienes soluciones para varios sensores. Mira con detenimiento

AlexLPD

Primero que nada: Que interesante proyecto, felicidades, sigue con el y si es posible sube algunas fotos, vamos!

Segundo, como menciona el compañero Surbyte hay una libreria con ejemplos, yo te recomiendo lo siguiente:

Ya funcioan tu codigo el MQ, déjalo como esta...
bajate la libreria y carga un ejemplo en la placa, revisa que funcione y que te de lecturas.

Une los dos en un nuevo sketch para mayor facilidad (asi si pasa algo no desmeritas ninguno de los dos ejemplos)


Mira aca es un ejemplo bien explicado;
http://forum.arduino.cc/index.php?topic=102729.0


Aqui te explican como leer mas de un sensor One wire;
http://forum.arduino.cc/index.php?topic=143382.0

Te dejo este articulo que describe mas sobre las redes largas de One wire;
https://www.maximintegrated.com/en/app-notes/index.mvp/id/148


Y bueno, te dejo un sketch que funciona, directamente de la primera liga;

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

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 12
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);


int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void)
{
 // start serial port
 Serial.begin(9600);
 Serial.println("Dallas Temperature IC Control Library Demo");

 // Start up the library
 sensors.begin();
 
 // Grab a count of devices on the wire
 numberOfDevices = sensors.getDeviceCount();
 
 // locate devices on the bus
 Serial.print("Locating devices...");
 
 Serial.print("Found ");
 Serial.print(numberOfDevices, DEC);
 Serial.println(" devices.");
 

 // report parasite power requirements
 Serial.print("Parasite power is: ");
 if (sensors.isParasitePowerMode()) Serial.println("ON");
 else Serial.println("OFF");
 
 // Loop through each device, print out address
 for(int i=0;i<numberOfDevices; i++)
 {
   // Search the wire for address
   if(sensors.getAddress(tempDeviceAddress, i))
 {
 Serial.print("Found device ");
 Serial.print(i, DEC);
 Serial.print(" with address: ");
 printAddress(tempDeviceAddress);
 Serial.println();
 
 Serial.print("Setting resolution to ");
 Serial.println(TEMPERATURE_PRECISION,DEC);
 
 // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
 sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
 
 Serial.print("Resolution actually set to: ");
 Serial.print(sensors.getResolution(tempDeviceAddress), DEC);
 Serial.println();
 }else{
 Serial.print("Found ghost device at ");
 Serial.print(i, DEC);
 Serial.print(" but could not detect address. Check power and cabling");
 }
 }

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
 // method 1 - slower
 //Serial.print("Temp C: ");
 //Serial.print(sensors.getTempC(deviceAddress));
 //Serial.print(" Temp F: ");
 //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

 // method 2 - faster
 float tempC = sensors.getTempC(deviceAddress);
 Serial.print("Temp C: ");
 Serial.print(tempC);
 Serial.print(" Temp F: ");
 Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}

void loop(void)
{
 // call sensors.requestTemperatures() to issue a global temperature
 // request to all devices on the bus
 Serial.print("Requesting temperatures...");
 sensors.requestTemperatures(); // Send the command to get temperatures
 Serial.println("DONE");
 
 
 // Loop through each device, print out temperature data
 for(int i=0;i<numberOfDevices; i++)
 {
   // Search the wire for address
   if(sensors.getAddress(tempDeviceAddress, i))
 {
 // Output the device ID
 Serial.print("Temperature for device: ");
 Serial.println(i,DEC);
 
 // It responds almost immediately. Let's print out the data
 printTemperature(tempDeviceAddress); // Use a simple function to print out the data
 }
 //else ghost device! Check your power requirements and cabling
 
 }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
 for (uint8_t i = 0; i < 8; i++)
 {
   if (deviceAddress[i] < 16) Serial.print("0");
   Serial.print(deviceAddress[i], HEX);
 }
}[/quote]


Bu I allways get:
[quote]Dallas Temperature IC Control Library Demo
Locating devices...Found 0 devices.
Parasite power is: OFF
Requesting temperatures...DONE
Requesting temperatures...DONE



En realidad solo tienes que jugar un poco con el sensor, no es nada difícil.
Bueno ya nos cuentas.

-Alex.

Go Up