DrivhusDuino – automatisk styring af et drivhus med en Arduino microcontroller. Måling af temperatur med DS18B20, og program.

Før du begynder.

Gå ind på Arduino’s hjemmeside  http://www.arduino.cc/  og sæt dig ind i hvad og hvordan – er det noget for dig?

Hvis du køber en Arduino er der også brug for et breadboard, løse ledninger og forskellige komponenter til at øve sig på. Jeg købte ikke et begyndersæt, men i stedet nogle lysdioder, en lysmåler, temperatursensorer og et display. Vent med styring af 230V til du har noget erfaring med tingene.

Nogle komponenter, display og nogle temperatursensorer, kræver et selvstændigt program for at kunne fungere – det finder man på nettet og lægger ind i Arduino’en.

En Arduino har ikke ubegrænsede ind- og udgange, så hvis man vil have et display til at vise målinger tager det plads fra sensorer.

En sensor kræver som minimum en plus og minus ledning, og nogle også en dataledning til at overføre målingen. Jeg vil gerne måle temperatur 5 steder, og her kommer DS18B20 ind i billedet.

DS18B20.

– og hvad er så det? Det er en sensor, der måler temperatur og digitaliserer målingen. Hver sensor har en adresse, så mikrocontrolleren kan spørge den enkelte sensor, hvad der er målt. Alle DS18B20 sensorer kan altså sættes på de samme 3 ledninger: plus, minus og data. Strengt taget kan de klare sig med 2 ledninger i såkaldt parasitic mode, hvor sensoren tapper strøm når den ikke skal sende noget.

Man kender ikke adressen på den enkelte sensor, og jeg kan se, at det program, jeg brugte, ikke er aktivt mere. Så søg på nettet     ds18b20 read adress   , sæt sensorerne op enkeltvis og kør programmet, så får du adressen på den enkelte sensor.

Lod sensorerne på tynde ledninger, kontroller, at det virker og dæk lodningerne med Araldit eller lignende.

Mine 5 sensorer viste den samme temperatur inden for 0,3 grader, når de lå sammen. Opløsningen er 0,06C.

Programmet.

Herunder er programmet, stumperne er funder på nettet, Jepsen PV electronics har hjulpet, og  lidt har jeg selv lavet, og det virker. Adresserne T1-T5 er mine adresser, de skal ændres til dine sensorer.

Læg mærke til, at udgang 13, Pin 13, bruges til at styre relæ til cirkulationspumpen, det kunne være gardiner eller vanding, med en anden programmering.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Data wire is plugged into port 22 on the Arduino
#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 12
// 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);
DeviceAddress T1 = { 0x28, 0x32, 0xEC, 0xA1, 0x04, 0x00, 0x00, 0xDE };
DeviceAddress T2 = { 0x28, 0xBF, 0xF0, 0xA0, 0x04, 0x00, 0x00, 0xAC };
DeviceAddress T3 = { 0x28, 0xA5, 0xAC, 0xA1, 0x04, 0x00, 0x00, 0x03 };
DeviceAddress T4 = { 0x28, 0x2E, 0xF5, 0xA1, 0x04, 0x00, 0x00, 0x77 };
DeviceAddress T5 = { 0x28, 0xD9, 0xF5, 0xA0, 0x04, 0x00, 0x00, 0x0F };

/*

Nr 1 Device is a DS18B20 : 28-32-EC-A1-04-00-00-DE Luft inde
Nr 2 Device is a DS18B20 : 28-D9-F5-A0-04-00-00-0F Jordtemp midt i huset i 22 cm dybde
Nr 3 Device is a DS18B20 : 28-A5-AC-A1-04-00-00-03 Jordvarme retur
Nr 4 Device is a DS18B20 : 28-BF-F0-A0-04-00-00-AC Jordvarme indløb
Nr 5 Device is a DS18B20 : 28-2E-F5-A1-04-00-00-77 Jordtemp ude i 22 cm dybde
*/

int relayPin = 13;

float dif=0;// forskellen mellem luft og jordtemp, styrer cirkulationspumpen //

void setup(void)
{
pinMode(relayPin, OUTPUT);

// start serial port
Serial.begin(9600);
lcd.begin(16, 2);
lcd.clear();
Serial.println(“Dallas Temperature IC Control Library Demo”);

// Start up the library
sensors.begin();
sensors.setResolution(T1, TEMPERATURE_PRECISION);
sensors.setResolution(T2, TEMPERATURE_PRECISION);
sensors.setResolution(T3, TEMPERATURE_PRECISION);
sensors.setResolution(T4, TEMPERATURE_PRECISION);
sensors.setResolution(T5, TEMPERATURE_PRECISION);

digitalWrite(relayPin, LOW);
}

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”);
float temp1=sensors.getTempC(T1);
float temp2=sensors.getTempC(T2);
float temp3=sensors.getTempC(T3);
float temp4=sensors.getTempC(T4);
float temp5=sensors.getTempC(T5);
Serial.print(“Temperature for the device 1 (index 0) is: “);
//Serial.println(sensors.getTempCByIndex(0));
Serial.println(temp1);
Serial.print(“Temperature for the device 2 (index 1) is: “);
Serial.println(temp2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print (“Luft = “);
lcd.print (temp1);
lcd.setCursor(0, 1);
lcd.print (“Midt = “);
lcd.print(temp2);
delay (2000);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print (“Vandud = “);
lcd.print (temp3);
lcd.setCursor(0, 1);
lcd.print (“Vandind = “);
lcd.print(temp4);
delay (2000);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print (“Ude = “);
lcd.print (temp5);
lcd.setCursor(0, 1);
lcd.print (“Dif = “);
lcd.print (dif);

delay (2000);

dif = (temp1) – (temp2);

if (dif >=2)
{digitalWrite(relayPin, HIGH); }
else
{digitalWrite(relayPin, LOW); }
}

 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *