Temperatūros loginimas su Arduino

11 12 2013

Arba kaip pažinti savo šaldytuvo veikimą 😀 Jei rimtai tai nusibodo man vis reguliuoti šaldytuvo skaičiukus nuo 1 iki 5 ieškant to geriausio šaldymo nustatymo nes jame vis peršala produktai. Tikėtina kad kažkas negerai su termostatu ar kas panašaus. Kodėl gi nepastebėjus ilgiau kas ten jame vyksta ir ar tie 1-5 nustatymai kažką daro.. Tam pasigaminau laikina įrenginuką.

Hardware dalis

Smegenys: naudosiu Arduino Mega nes šiuo metu kitokio neturiu. Pilnai pakanka ir Uno ar dar kitokio nes kodo nedaug, o įėjimų bei išėjimu reikia taip pat nedaug.

Sensoriai: DS19B20. Mano atveju naudosiu 2 vienetus, o galima pasijungti kad ir 6. Juos sujungiu prie Arduino elektrodų A0 – A5 kažkaip panašiai kaip google rodo. Tam kartui nenaudoju vieno laido varianto nes nelabai noriu aiškintis kur kurio daviklio adresas 🙂

Duomenų saugojimas: SD kortelė ir Serial išėjimas. Dėl serial išėjimo bedų nebus bet SD kortelei jum jau reikės pasistengti. Aš naudosiu interfeisą esanti Ethernet skydelyje.

Laikas: seksime jį su DS1302 laikrodžiu. Šiaip galime jo iš vis nenaudoti bet aš noriu matyti tinkam laiką loguose bei jų failus pavadinti panaudojant datą. Jungiam prie arduino jį kažkaip panašiai kaip google siūlo, o mano atveju CE – Digital5, IO – Digital6 ir  SCLK – Digital7. Taip esu pajungęs savąjį jau nuo seniau, tad nieko nekeisiu.

Visas šis darinukas atrodo štai taip mano atveju bet tai tik todėl kad šį setup’ą turiu gamindamas gudrų namą:

2r16

Maitinti galime nuo +12 batareikos ar kokio tai adapterio.

Software dalis

Taigi pradedant nuo pražiu pakalbęsiu kokias bibliotekas naudosiu ir galiausiai pakopijuosiu visa kodą.

Temperatūrai nuskaityti pasirašiau nedidele funkciją kuri naudoja OneWire biblioteką. Ji jau yra Arduino IDE viduje tad nieko jums kaip ir nereikia

SD kortelė pas mane pajungta per SPI tad su ja bendrausime per Arduino IDE esančią SD biblioteką. Kadangi  ši biblioteka parenta SDFat pagrindu tai aš mėgėjas iškarto ją ir naudoti. Gal kiek ir nepatogu bet taip man yra geriau. Mat kartais vien SD metodu nepakanka.

Su laikroduku tiesiogiai bendrauti nenoriu tai pasinaudojau biblioteka https://github.com/msparks/arduino-ds1302.

Kaip ir viskas. Kodas, kuris skaito 6 temperatūros daviklius ir juos logina į SD kortelę kas 10 sekundžių:

#include <SPI.h>
#include <OneWire.h>
#include <SD.h>
#include <DS1302.h>

#define SD_CS 4
#define BUZZER_PIN 3
#define CE_PIN 5
#define IO_PIN 6
#define SCLK_PIN 7

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

unsigned long timer;
boolean cardOk = false;

void setup () {
Serial.begin(9600);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
if (card.init(SPI_FULL_SPEED, SD_CS)) {
if (volume.init(&card)) {
if (root.openRoot(&volume)) {
cardOk = true;
}
}
}
if (!cardOk)
sound(100);
rtc.write_protect(false);
rtc.halt(false);
Serial.println(“Logger Started!”);
timer = millis();
}

void loop() {
if (timer<millis())
{
Time t = rtc.time();
float temp1 = getDS18B20Temperature(A0);
float temp2 = getDS18B20Temperature(A1);
float temp3 = getDS18B20Temperature(A2);
float temp4 = getDS18B20Temperature(A3);
float temp5 = getDS18B20Temperature(A4);
float temp6 = getDS18B20Temperature(A5);
char filename[12];
byte id = 0;
filename[id++] = ‘S’;
filename[id++] = (t.yr-2000)/10 + ‘0’;
filename[id++] = t.yr%10 + ‘0’;
filename[id++] = t.mon/10 + ‘0’;
filename[id++] = t.mon%10 + ‘0’;
filename[id++] = t.date/10 + ‘0’;
filename[id++] = t.date%10 + ‘0’;
filename[id++] = ‘.’;
filename[id++] = ‘C’;
filename[id++] = ‘S’;
filename[id++] = ‘V’;
filename[id++] = ”;
if(file.open(&root, filename, O_CREAT | O_APPEND | O_WRITE))
{
file.print(t.hr/10); file.print(t.hr%10); file.print(‘:’);
file.print(t.min/10); file.print(t.min%10); file.print(‘:’);
file.print(t.sec/10); file.print(t.sec%10); file.print(‘;’);
file.print(temp1); file.print(‘;’);
file.print(temp2); file.print(‘;’);
file.print(temp3); file.print(‘;’);
file.print(temp4); file.print(‘;’);
file.print(temp5); file.print(‘;’);
file.print(temp6); file.println(‘;’);
file.close();
sound(5);
}
else
{
sound(100);
}
Serial.print(t.hr/10);Serial.print(t.hr%10);Serial.print(‘:’);
Serial.print(t.min/10);Serial.print(t.min%10);Serial.print(‘:’);
Serial.print(t.sec/10);Serial.print(t.sec%10);Serial.print(‘;’);
Serial.print(temp1);Serial.print(‘;’);
Serial.print(temp2);Serial.print(‘;’);
Serial.print(temp3);Serial.print(‘;’);
Serial.print(temp4);Serial.print(‘;’);
Serial.print(temp5);Serial.print(‘;’);
Serial.print(temp6);Serial.println(‘;’);
timer +=10000;
}
}

float getDS18B20Temperature(byte port)
{
OneWire ds(port);
float temp;
byte i;
byte present = 0;
byte data[12];
byte addr[8];
if (!ds.search(addr)) {
ds.reset_search();
return 0;
}
if (OneWire::crc8( addr, 7) != addr[7]) {
return 0;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
delay(850);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
temp = ( (data[1] << 8) + data[0] )*0.0625;
return temp;
}

void sound(int timeout)
{
digitalWrite(BUZZER_PIN,HIGH);
delay(timeout*0.1);
digitalWrite(BUZZER_PIN,LOW);
}

Kiek negražiai čia pasikopino bet velniai nematė. Dar kode matote mano nepaminėtą sound() funkcija kuri tiesiog pypina pajugtą buzerį jei kokia problema. Jį jau turiu setup’e tai kodėl nepanaudojus 🙂

Rezultatai

Loginimo eigoje Serial terminale matome tai ką turėsime ir SD kortelėje:

10:59:09;40.44;0.00;0.00;0.00;0.00;0.00;
10:59:19;40.44;0.00;0.00;0.00;0.00;0.00;
10:59:29;40.50;0.00;0.00;0.00;0.00;0.00;
10:59:39;40.56;0.00;0.00;0.00;0.00;0.00;
10:59:49;40.50;0.00;0.00;0.00;0.00;0.00;
10:59:59;40.50;0.00;0.00;0.00;0.00;0.00;

Testuojant labai idomu stebėti kaip šildomas kambarys nešiojamo kompiuterio aušintuvu. 40 minučiu ir 10kB dydžio S131211.CSV faile turime štai tokią informaciją:

ru8u

Dabar galima pradėti šaldytuvo persekiojimą. Tai užtruks, grįšiu vėliau.


Veiksmai

Information

4 responses

11 12 2013
Darau, Blė

O kas ten tame laikroduko skydelyje dar yra?

12 12 2013
mindogas

Na ten yra viskas ko man gudram namui reikejo: laikrodis su baterija, RS485 adapteris, I2C EEPROM (kurios dar nenaudoju bet gal reiks) ir jungtis komunikacijai bei maitinimui.

12 12 2013
Šviesos loginimas su Arduino | Mindaugas Markauskas

[…] visokių dalykų loginimą, pvz. paprasčiausios temperatūros, nusprendžiau atlikti dar vieną eksperimentą su buitimi. Šį karta matuosi šviesos […]

23 12 2013
Šaldytuvo 1-5 reguliatoriaus padėčių dekodavimas | Mindaugas Markauskas

[…] panaudosiu jau aprašytą temperatūros logerį. Atlikęs gana patogią instaliaciją pradėjau […]

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti / Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti / Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti / Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti / Keisti )

Connecting to %s




%d bloggers like this: