Šviesos loginimas su Arduino

12 12 2013

Tęsiant visokių dalykų loginimą, pvz. paprasčiausios temperatūros, nusprendžiau atlikti dar vieną eksperimentą su buitimi. Šį karta matuosi šviesos intensyvumą. Kitaip nei matavome temperatūrą dabar mane domina ne ilgalaikio stebėjimo duomenys, o kaip tik trumpalaikis dalykas. T.y. aš noriu kuo detaliau pamatyti kas vyksta trumpame laiko periode. Kitame įraše parodysiu kokią nesamanę sugalvojau patyrinėti 😀

Hardware dalis

Smegenys: Bet koks Arduino, mano atveju Mega (nes kitokio neturiu). Arduino naudoju nes įtaisas labai jau laikinas ir nieko nereikia lituoti ir panašiai. Va dėl to myliu Arduino.

Sensorius: paprasčiausias 10k fotorezistorius. Jau seniau esu su juo žaidęs tad sename įrašę galite pamatyti kaip jį pasijungti. Jungiu jį prie A0 įėjimo ir galvos sau nesunkinu.

Duomenų saugojimas: SD kortelė. Naudosiu Ethernet skydelio kortelės dalį. Galima kaip išvedimą naudoti Serial sąsają, bet kaip vėliau paaiškėja kelis keliasdešimt tūkstančių baitų taip perduoti užtrunka ilgokai.

Laikas: man reiktu laikrodžio failo pavadinimui generuoti tad naudosiu DS1302  laikrodį tam. Jungiam prie arduino jį kažkaip panašiai kaip google siūlo, o mano atveju CE – Digital5, IO – Digital6 ir  SCLK – Digital7. Jei nenorite galite jo atsisakyti ir faila pavadinti kaip norite.

Kaip ir senesniame loginimo projekte naudoju savo gudraus namo ekpermentini gaminį prie kurio tik pridėjau šviesos sensorių:

wj21

Beja, šviesos sensoriu sumontavau atvirkščiai, o tai pastebėjau pervėlai.. Nieko tokio, PC vėliau duomenis lengva apversti..

Software dalis

Iš bibliotekų naudojau tik dvi: standartinė SD kortelės  biblioteka bei papildoma DS1302  kurią parsisiųsti galite iš čia: https://github.com/msparks/arduino-ds1302.

Taigi pilnas kodas:

#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;
#define scale 5*60*1000

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!”);
}

void loop() {
Time t = rtc.time();
char filename[12];
byte id = 0;
filename[id++] = ‘S’;
filename[id++] = t.hr/10 + ‘0’;
filename[id++] = t.hr%10 + ‘0’;
filename[id++] = t.min/10 + ‘0’;
filename[id++] = t.min%10 + ‘0’;
filename[id++] = t.sec/10 + ‘0’;
filename[id++] = t.sec%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))
{
sound(500);
timer=millis();
for (int i =0; i<scale; i++)
{
while (timer>millis()) {}
file.print(analogRead(A0)); file.println(‘;’);
timer=millis()+10;
}
file.close();
sound(500);
delay(100);
sound(500);
delay(100);
sound(1000);
delay(100);
sound(1000);
delay(100);
sound(2000);
}
else
{
sound(100);
delay(100);
sound(100);
}
while (true) {}
}

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

Dabar ką jis daro papasakosiu. Ogi jis pypteli buzeri pradėdamas darbą, sugeneruoja CSV failą, kurio pavadinimas yra dabartinis laikas, ir į tą failą kas 10ms įrašinėją nuskaitytas analogines reikšmes iš šviesos sensoriaus. Baigęs kažkiek darbo (mano atveju 30000 nuskaitymu kas yra 5 minutės stebėjimo) uždaro failą ir atlieka serija pyptelėjimų taip paskelbdamas darbo pabaigą. Beja, darbo pabaigos reikia sulaukti nes kitaip failo neuždarius jo dydis bus 0 ir duomenų jame matysime.

Rezultatai

Pats logas darant 30000 nuskaitymų užims apie 175kB SD kortelėje. Kadangi failų pavadinimai generuojami su laikais tai nuskaitymo seansų galima daryti kiek norime, o galiausiai failus (pvz. S190328.CSV, S190606.CSV ir t.t) keliame į kompiuterį ir redaguojame su kokia norite lentelių programa. CSV rezultatai bus panašus į tai:

311;
310;
310;
310;
310;
310;
309;
310;
311;
310;
309;
310;
311;

ir t.t.

Kitame įraše pratęsiu rezultatus ir pamatysite ką aš sugalvojau.


Veiksmai

Information

4 responses

12 12 2013
giedriuszzz

Suintirgavai, protingo namo koncepciją turi ? Kas bus kontroliuojama, kokius parametrus reikės sekti ?

12 12 2013
mindogas

Na šitas loginimas nelabai su mano protinguoliu susyjęs bet yra ir ano atskiras projektas kurs vis dar tobulinamas. Apie ana dabar nelabai galiu liežuvio laidyti nes ten dar ne viskas baigta ir galiu prisikalbėti 😀 Jei įdomu parašyk man mail’ą ar per Skype, galima būtų privačiai apie tai pakalbėti.

12 12 2013
Taupiųjų lempučių užsidegimo tyrimas | Mindaugas Markauskas

[…] įrašas tai pratęsimas prieš tai buvusio, kuriame aptariau kaip su Arduino stebėti šviesos intensyvumą trumpame […]

22 02 2014
E14 R50 lemputės – LED prieš katrinukes | Mindaugas Markauskas

[…] ar mažiau palyginus su 40W lempute. Kad patikrinti kuris šaltinis šviesesnis pasinaudosiu savo šviesos loginimo įrenginiu ir pakartosiu seniau atliktą […]

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: