Om oss

Denne siden omhandler bryggerlauget Svarstad Ølbryggerlaug, SØL for short. Her vil vi publisere litt info om bryggingen, bilder og video.
Viser innlegg med etiketten temperaturmåler. Vis alle innlegg
Viser innlegg med etiketten temperaturmåler. Vis alle innlegg

onsdag 5. november 2014

DIY: Enkel arduino temperatursensor med LCD

I anledning den nye meskeboksen må der også temperaturavlesning til. Fremfor å åpne/lukke boksen hver gang man vil sjekke mesketemperaturen, kan det være greit å ha en probe i selve mesken og kunne lese av temperaturen på utsiden av boksen. Enter Arduino + LCD shield + DS18B20.

Handleliste
1 stk Arduino (eller tilsvarende) - 41,20 kr
1 stk LCD shield - 24,44 kr
1 stk DS18B20 sensor (preferert vanntett utgave, ferdig kablet) - 11,44 kr
1 stk koblingsboks (art.nr. 32-6183) - 59 kr
Wagoklemmer
Kabler
Elektrikertape
Evt. strømforsyning - 26,91 kr


The wire-up
Klem på LCD-shieldet til Arduinoen, koble signal fra temperatursensoren til digital 3, jord til jord og power til 5V. Dernest en 4,7 kOhm motstand mellom signal og 5V. Voila! Jeg benyttet wagoklemmer til kobling av motstand for å gjøre det enkelt.
Koblingsskjema

The code

/*
The circuit:
 * LCD RS pin to digital pin 8
 * LCD Enable pin to digital pin 9
 * LCD D4 pin to digital pin 4
 * LCD D5 pin to digital pin 5
 * LCD D6 pin to digital pin 6
 * LCD D7 pin to digital pin 7
 * LCD R/W pin to ground
 */

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int lcd_key     = 0;
int brightness = 50;
int adc_key_in  = 0;
double temp;
double mintemp = 100;
double maxtemp;
double lasttemp;

String infotext = " Rogue Brewing  ";
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
#define ONE_WIRE_BUS 3                              // Data wire is plugged into digital pin 3 on the Arduino
#define NumberOfDevices 2                           // Set maximum number of devices in order to dimension array holding all Device Address arrays.

OneWire oneWire(ONE_WIRE_BUS);                      // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);                // Pass our oneWire reference to Dallas Temperature. 
byte allAddress [NumberOfDevices][8];               // Device Addresses are 8-element byte arrays. We need one for each of our DS18B20 sensors.
byte totalDevices;                                  // Declare variable to store number of One Wire devices that are actually discovered.

void setup() {
  lcd.begin(16,2);
  Serial.begin(9600);
  sensors.begin();
  analogWrite(10,brightness);

  totalDevices = discoverOneWireDevices();         // get addresses of our one wire devices into allAddress array 
  for (byte i=0; i < totalDevices; i++) {
    sensors.setResolution(allAddress[i], 10);      // and set the a to d conversion resolution of each.
  }
}

byte discoverOneWireDevices() {
  byte j=0;                                         // search for OneWire devices and copy to device address arrays.
      while ((j < NumberOfDevices) && (oneWire.search(allAddress[j]))) {        
    j++;
  }
  return j;                                         // return total number of devices found.
}

String printAddress(DeviceAddress addr) {
  byte i;
  String ad = "";
  for( i=0; i < 8; i++) {                         // prefix the printout with 0x
      if (addr[i] < 16) {
        ad = ad + "0";                            // add a leading '0' if required.
      }
      ad = ad + String(addr[i], HEX);             // print the actual value in HEX
      if (i < 7) {
      }
    }
    return ad;
}

double printTemperature(DeviceAddress addr) {
  float tempC = sensors.getTempC(addr);           // read the device at addr.
  if (tempC == -127.00 || tempC == 85.00) {
    double diff = tempC - lasttemp;
    if(diff > 2 || diff < -2)
    {
      return lasttemp;
    }
  }
  
  lasttemp = tempC;
  if(tempC != 0.00){
  if (tempC > maxtemp){
    maxtemp = tempC;
  }
  else if(tempC < mintemp){
    mintemp = tempC;
  }
  else{}
  }
  return tempC;                                 // and print its value.

}

void adjust_brightness(String mode)
{
  if(mode == "add")
  {
    if(brightness < 150)
    {
       brightness += 10;
       analogWrite(10,brightness);
       Serial.println("test");
    }
  }
  else
  {
    if(brightness > 0)
    {
       brightness -= 10;
       analogWrite(10,brightness);
    }
  }
}
int read_LCD_buttons()
{
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;  
  if (adc_key_in < 250)  return btnUP; 
  if (adc_key_in < 450)  return btnDOWN; 
  if (adc_key_in < 650)  return btnLEFT; 
  if (adc_key_in < 850)  return btnSELECT;  

  return btnNONE;
}

void loop() {

  sensors.requestTemperatures();                // Initiate  temperature request to all devices
  for (byte i=0; i < totalDevices; i++) {
    if(printAddress(allAddress[i]) == "28b914fb0500003c") {
      temp = printTemperature(allAddress[i]);
    }
  }

  String tempstring = "Temp: " +String(temp) +" C  ";

  lcd.setCursor(0, 0);
  lcd.print(tempstring);

  lcd.setCursor(0,1);
  lcd.print(infotext);
  delay(50);

  lcd_key = read_LCD_buttons();

  switch (lcd_key)
  {
    case btnRIGHT:
    {
      lcd.setCursor(0,1);
      infotext = "MAX: " +String(maxtemp) +"      ";
      break;
    }
    case btnLEFT:
    {
      lcd.setCursor(0,1);
      infotext = "MIN: " +String(mintemp) +"      ";
      break;
    }
    case btnUP:
    {
      adjust_brightness("add");
      break;
    }
    case btnDOWN:
    {
      adjust_brightness("subtract");
      break;
    }
    case btnSELECT:
    {
      lcd.setCursor(0,1);
      infotext = " Rogue Brewing  ";
      break;
    }
    case btnNONE:
    {
      break;
    }
  }
 }

Kommentarer til koden:
- Knappene på LCD-shield gjør følgende:
  • SELECT: Nullstiller teksten på linje 2 i displayet
  • LEFT: Viser minste registrerte temperatur
  • RIGHT: Viser høyeste registrerte temperatur
  • UP/DOWN: Justerer brightness i displayet
  • RESET: Reset
- Av og til kommer syke temperaturavlesninger som f.eks. -127 og 85. Derfor er det lagt inn meget enkelt feilhåndtering som ikke registrerer slike feilregistreringer

The setup

Stripp koblingsboksen for alt unødvendig støpt plast og kutt til litt spor slik at Arduinoen fits like a glove. Skjær ut hull i lokket til LCD-skjerm og knapper. Før gjennom USB/strømkabel og sensor, og legg wagoklemmene fin nedi boksen. Sett på lokket. Eventuelt gå amok med elektrikertape og litt papp for å dekke til litt blemmer og andre åpninger i boksen ;)


Minste registrerte temperatur

Høyeste registrerte temperatur - høyeste lysstyrke

Høyste registrerte temperatur - laveste lysstyrke

Lokk ferdig utskjært. Sort of...

Let's tape this motha up!



Se så! Da var det bare å klaske på borrelåstape på baksida og klemme den fast på meskeboksen, evt en vegg i nærheten og slippe sensoren nedi mesken.

søndag 28. juli 2013

Temperaturkontroll STC-1000



Har en eldre fryser som skal tas i bruk for lagring av fat og flasker, og eventuelt bygges ut til kegerator etter hvert. Trenger altså en temperaturkontroller til denne fryseren, så i går ble en slik satt sammen.

OPPDATERING 18.01.2016
Siden denne siden viser seg å være ganske populær, har jeg tatt noen oppdaterte bilder av selve koblingene, da mange spør om dette. Here goes:

Alle STC-1000 jeg har bestilt har denne rekkefølgen på koblingene


Korresponderende koblingsskjema vil derfor bli seende slik ut





Overblikksbilde

Koblinger STC-1000. Fra venstre: Til "live block", til "neutral block", sensor, sensor, til "live block", til kjøleutgang, til "live block, til varmeutgang

Her er (fra venstre): "live block", "earth block", "neutral block". Nederst ser man hovedinntaket, som går til stikk i vegg. Til høyre utgang til kjølekilde og varmekilde. Alle jordledere termineres i "earth block" og kommer fra hhv inntak, kjølekilde og varmekilde. Alle "blå ledere" fra inntak, varme- og kjølekilde går til "neutral block". "Brun leder" fra inntak går til "live block", "brun leder" fra varmekilde til STC-1000 port 6, og "brun leder" fra kjølekilde til STC-1000 port 8. 


Deleliste:
STC-1000 modul fra eBay, kr 116,-
Koblingsboks fra Clas Ohlson (art.nr. 32-7417),  kr 139,-
2 stk vegguttak fra Clas Ohlson (art.nr. 32-5441), à kr 49,-
Ledning med støpsel (hadde dette liggende fra før)
WAGO-klemmer

Da alt var ferdig og støpselet ble satt i sto det "EE" på displayet og en stygg lang pipelyd var å høre fra modulen. Svettet litt da jeg trodde noe var feilkoblet, og hadde lite lyst til å begynne forfra igjen. Heldigvis var det kun den ene lederen til sensoren som hadde løsnet fra STC-1000, så det var en quick fix :)

Koblingsboks 

Merket av for innfelling av STC-1000 

Hull til STC-1000 ferdig skjært ut ( ikke så voldsomt pent, men det spiller ingen rolle da modulen dekker dette) 

På plass 

 Hull til feste av stikk

Stikk festet 

Hull til gjennomføring av ledning 

Ledning til støpsel 

Et lite hakk til gjennomføring av sensor
Koblingsskjema som ble brukt. NB! På min modul er "HEAT" og "COOL" motsatt av dette skjemaet. Jeg koblet derfor "HEAT" til nr. 6 og "COOL" til nr. 8. Ellers er det helt likt.

Ledninger festet og tvinnet sammen, klare for lodding
EDIT: I etterkant har jeg gjort om på dette, og benyttet WAGO-klemmer i stedet for lodding. Anbefaler absolutt disse klemmene fremfor en muligens skjør lodding

En slags lodding, ikke så pent, men det duger til formålet

Ledninger ført i gjennom lokk, krympestrømper satt på

Krympestrømper ferdige

Strips satt på ledningene for å unngå at disse blir revet ut ved belastning

Klar for kobling av stikk

Stikk ferdig koblet

Ferdig!

Stikk merket og modulen fungerer som den skal


onsdag 1. mai 2013

Statusoppdatering Batch #6

Foretok en SG-måling i går, og refraktometeret viste 11 Brix. Omregnet til gravitypoeng, med gjærende vørter tatt høyde for, gir en SG på 1.036 (etter 3 dagers gjæring). Temperaturen har ligget stabilt rundt 11 grader Celcius (probe er festet med styrofoam på utsiden av gjæringskaret).

torsdag 7. mars 2013

Temperaturprober på plass

Prosjekte Arduino temperaturlogger er ferdig og i går kveld satt jeg opp temperaturloggeren i øleskapet i kjelleren. Har montert tre prober, der den ene måler temperaturen i rommet, den andre inne i kjøleskapet, mens den siste har jeg tredd ned i en ølflaske fyllt med vann. Har per nå ingenting til verken gjæring eller modning, men kan i det minste logge noen temperaturer for moro skyld :)

Se link i menyen til høyre.

søndag 24. februar 2013

Arduino temperaturlogger

Jeg har syslet litt med å lage en temperaturlogger for å kunne logge temperaturer under gjæringsprosessen, og eventuelt andre bruksområder.

Se guiden min her:

Arduino temperaturlogger - del 1 (Arduino-koding, montering, lodding, et.c.)
Arduino temperaturlogger - del 2 (Bygge inn Arduino'en i en koblingsboks)
Arduino temperaturlogger - del 3 (Hente ut og presentere data fra database)

lørdag 17. november 2012

Ny gadget og flaskegranat!

I dag morges skulle var jeg nede og så til min share av lagerbrygget fra Batch #2. Det luktet mer øl enn vanlig på rommet der gjæringsbøtta og flaskene til karbonering står, og da lyset ble påslått ventet dette synet:


Det var kun èn flaske som har gått føyken, så om årsaken ligger i den ene flaska eller om alt nå er ferdig karbonert (etter èn uke) er uklart... Uansett tok jeg ikke noen sjanse på å miste flere dyrebare dråper, så de ble satt i kjelleren, litt kaldere. Lar de hvile der en uke til før de settes i kjøleskapet for lagring.

Fikk denne i posten i dag, bestilt fra DealExtreme:


Vet ikke helt hvor nøyaktig og pålitelig den er, men kjekt og moro å kunne "skyte" temperaturen :)


16,90 USD er heller ikke den største utgiften :)