DIY Arduino Termometer
: 11. okt 2015, 00:52
Jeg havde behov for et termometer med 3 følere, da jeg brygger med 3 gryder og var træt af konstant at skulle "flytte" proben på mit termometer mellem gryderne.
Jeg ville have et samlet display med visning af temperaturen for 3 følere på en gang, og min løsning var at bygge et baseret på Arduino og DS18B20 følere. Der findes mere præcise følere, men DS18B20 er nemme at arbejde med og, iflg. producenten, præcise indenfor +/- 0.5 grad i det område jeg skal bruge dem til at måle - og så er de billige ;-)
Jeg besluttede senere at jeg lige så godt kunne bruge alt pladsen i displayet til noget, og kodede derfor en stopursfunktion ind i arduinoen.
Der kunne kodes en lang række andre ting ind i den, men jeg har holdt så simpelt som muligt.
Diagrammet for det hele ser således ud: Ledningerne der går til displayet skal man ikke tage så alvorligt, der er brugt et I2C serielt display med kun 4 pins, men det var ikke lige lagt ind i Fritzing - ligesom antallet af følere blot er vist som en, men der kan tilsluttes mange flere de skal blot tilsluttes de samme ledninger.
For at bygge det skal man bruge:
1 X Arduino UNO (eller lign. board) http://www.aliexpress.com/item/Free-Shi ... 01531.html" onclick="window.open(this.href);return false;
3 X DS18B20 (evt. med ledning og dykrør) http://www.aliexpress.com/item/Free-Shi ... 28409.html" onclick="window.open(this.href);return false;
2 X Trykknapper http://www.aliexpress.com/item/S105-5xM ... 93844.html" onclick="window.open(this.href);return false;
1 X LCD 1602 med I2C board monteret. http://www.aliexpress.com/item/IIC-I2C- ... 73825.html" onclick="window.open(this.href);return false;
2 x 220 ohm modstande
1 X 4,7 Kohm modstand.
Ledninger og en kasse til at bygge det hele ind i.
Jeg har endvidere monteret en afbryder og et 9V batteri, men man kan bare forsyne Arduinoen med strøm via dens (USB) stik og en ekstern strømkilde.
Koden er ret simpel:
En af de smarte ting ved denne kode er at den selv opdager antallet af følere og adresserne på disse.
I det valgte display er der plads til 4 visninger, man kan derfor fjerne ur funktionen og tilslutte en DS18B20 mere hvis man har brug for 4 følere.
For at starte uret trykker man på en grøn knap, stop er den røde knap og nulstil er begge knapper samtidig.
Når de sidste stumper kommer og jeg kan bygge det helt færdigt lægger jeg fotos op af "dyret," i udviklingsopstillingen ser det således ud:
Jeg ville have et samlet display med visning af temperaturen for 3 følere på en gang, og min løsning var at bygge et baseret på Arduino og DS18B20 følere. Der findes mere præcise følere, men DS18B20 er nemme at arbejde med og, iflg. producenten, præcise indenfor +/- 0.5 grad i det område jeg skal bruge dem til at måle - og så er de billige ;-)
Jeg besluttede senere at jeg lige så godt kunne bruge alt pladsen i displayet til noget, og kodede derfor en stopursfunktion ind i arduinoen.
Der kunne kodes en lang række andre ting ind i den, men jeg har holdt så simpelt som muligt.
Diagrammet for det hele ser således ud: Ledningerne der går til displayet skal man ikke tage så alvorligt, der er brugt et I2C serielt display med kun 4 pins, men det var ikke lige lagt ind i Fritzing - ligesom antallet af følere blot er vist som en, men der kan tilsluttes mange flere de skal blot tilsluttes de samme ledninger.
For at bygge det skal man bruge:
1 X Arduino UNO (eller lign. board) http://www.aliexpress.com/item/Free-Shi ... 01531.html" onclick="window.open(this.href);return false;
3 X DS18B20 (evt. med ledning og dykrør) http://www.aliexpress.com/item/Free-Shi ... 28409.html" onclick="window.open(this.href);return false;
2 X Trykknapper http://www.aliexpress.com/item/S105-5xM ... 93844.html" onclick="window.open(this.href);return false;
1 X LCD 1602 med I2C board monteret. http://www.aliexpress.com/item/IIC-I2C- ... 73825.html" onclick="window.open(this.href);return false;
2 x 220 ohm modstande
1 X 4,7 Kohm modstand.
Ledninger og en kasse til at bygge det hele ind i.
Jeg har endvidere monteret en afbryder og et 9V batteri, men man kan bare forsyne Arduinoen med strøm via dens (USB) stik og en ekstern strømkilde.
Koden er ret simpel:
Kode: Vælg alt
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <StopWatch.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// Opløsningen på DS18B20
#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);
// set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27,16,2);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// Antal DS18B20
int numberOfDevices;
// Variable til opbevaring af DS18B20 adresserne
DeviceAddress tempDeviceAddress;
//Definer kontaktpins
const int buttonRed = 3;
const int buttonGreen = 4;
//Definer variable
int buttonStateRed = 0;
int buttonStateGreen = 0;
int h = 0;
StopWatch Ur;
float ES, EM, ET;
void setup(void)
{
//Initialiser input pins
pinMode(buttonRed, INPUT);
pinMode(buttonGreen, INPUT);
// initialize the lcd
lcd.init();
lcd.clear();
// Turn on the LCD.
lcd.backlight();
// Start up the ds18b20 library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// Start afvikling af program
lcd.print("Velkommen til");
lcd.setCursor(0,1);
lcd.print("Bryggeri Landly"); // Lidt sjov skal man jo have
delay(2500);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Fandt ");
lcd.print(numberOfDevices, DEC);
lcd.println(" enheder.");
delay(1500);
lcd.clear();
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
lcd.print(tempC,1);
}
//Funktion til opdatering af temp. i display
void UpdateDisplay()
{
sensors.requestTemperatures(); // Send the command to get temperatures
lcd.print(" "); //ryd området med temperaturer.
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++) // gentag for alle fundne DS18B20
{
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i))
{
if(i>1)
{
lcd.setCursor(0,1); // Hvis det er 3. sensor der skal vises sæt cursor i rette position.
}
if(i>0 && i<2) //hvis i er lig 1
{
lcd.setCursor(8,0); // Hvis det er 2. sensor der skal vises sæt cursor i rette position.
}
// Output the device ID
lcd.print(i+1,DEC); // Læg 1 til device ID, da den ellers vil starte med 0
lcd.print(":");
printTemperature(tempDeviceAddress); // Udskriv temp data for den aktive føler.
}
}
h=0; // Variable der bestemmer hvornår display skal opdateres, nulstilles inden der vendes tilbage til hovedløkken
}
void loop(void)
{
h++;
buttonStateRed = digitalRead(buttonRed); //Aflæs rød knaps tilstand
buttonStateGreen = digitalRead(buttonGreen);//Aflæs grøn knaps tilstand
ES = (Ur.elapsed()/1000) % 60; //Sekunder, heltaldivideres og resten vises.
EM = (Ur.elapsed()/60000) % 60; //Minutter, heltaldivideres og resten vises.
ET = Ur.elapsed()/3600000; //Timer
if (h>250) // Ønskes opdatering af display i kortere eller længere interval ændres denne. 250 svarer til ca 8 sekunder.
{
UpdateDisplay();
}
lcd.setCursor(15,1); //Sæt cursor til linje 2 position 15, nederst til højre.
//Læs knapper
if (buttonStateRed == HIGH && buttonStateGreen == LOW) // Stop ur
{
lcd.print("R"); // Angiv i display at rød knap er trykket ned
Ur.stop();
}
if (buttonStateGreen == HIGH && buttonStateRed == LOW) //Start ur
{
lcd.print("G"); // Angiv i display at grøn knap er trykket ned
Ur.start();
}
if (buttonStateGreen == HIGH && buttonStateRed == HIGH) //Nulstil ur
{
lcd.print("B"); // Angiv i display at rød og grøn knap er trykket ned
Ur.reset();
}
//Print ur
lcd.setCursor(8,1); //Sæt Curson til den position hvor tiden skal skrives.
lcd.print(ET,0);
lcd.print(":");
if(EM<10) // Hvis EM er på 1 tal skal der tilføjes et "0" foran
{
lcd.print("0");
}
lcd.print(EM,0);
lcd.print(":");
if(ES<10) // Hvis ES er på 1 tal skal der tilføjes et "0" foran
{
lcd.print("0");
}
lcd.print(ES,0);
delay(10); // Vent et kort øjeblik, så der er tid til at opdage knappen evt. er trykket ned.
lcd.setCursor(15,1);
lcd.print(" "); // Tøm cellen der angiver knap-tilstand
}
I det valgte display er der plads til 4 visninger, man kan derfor fjerne ur funktionen og tilslutte en DS18B20 mere hvis man har brug for 4 følere.
For at starte uret trykker man på en grøn knap, stop er den røde knap og nulstil er begge knapper samtidig.
Når de sidste stumper kommer og jeg kan bygge det helt færdigt lægger jeg fotos op af "dyret," i udviklingsopstillingen ser det således ud: