Szukaj na tym blogu

czwartek, 10 października 2013

Nowa sonda - pierwsza analiza danych

Jak już pisałem w poprzednim poście nowa sonda nadaje nieco inaczej. Wczoraj zabrałem się za pierwszą analizę danych. Nie jest, niestety, tak prosto jak poprzednio. O ile same bity są wysyłane prawie analogicznie jak w poprzedniej sondzie, to ich interpretacja na razie mi się nie udała.

środa, 9 października 2013

Nowa sonda bezprzewodowa

Wstęp

Kupiłem sobie właśnie nowy zestaw, termometr + sonda, tej samej firmy co poprzednio. Sama sonda z zewnątrz jest identyczna z poprzednią. Byłem przekonany, że ta sonda będzie nadawać w identyczny sposób jak poprzednia. Nie jest tak niestety. Obie sondy, które mam nie są odbierane przez termometry.Tzn stara sonda tylko przez stary termometr jest odczytywana, a nowa przez nowy.

wtorek, 20 sierpnia 2013

Podłączenie odczytu sondy do reszty układu

Podsumowanie

Ostatnio podłączyłem to wynik moich prac nad odczytem bezprzewodowej sondy do reszty układu i teraz pomiary temperatury i wilgotności zza okna przesyłane są do komputera razem z resztą danych.

Tak wygląda całość zmontowana i działająca


sobota, 13 lipca 2013

Odczyty z bezprzewodowej sondy po I2C - POC

Wstęp

Ostatnio zmontowałem układ do odczytu bezprzewodowej sondy temperatury i wilgotności. Patrz:
Teraz postanowiłem podłączyć go do układu odczytującego temperatury i wilgotności z czujników podłączonych kabelkami (patrz np http://arduinoj.blogspot.com/2013/04/pierwsza-produkcyjna-implementacja_28.html).
Wybór padł na interfejs I2C. Czemu akurat ten. A bez konkretnego powodu, raz żeby go poznać, a dwa bo jakoś intuicyjnie wydał mi się dobry.

Na zdjęciu poniżej widać wszystko co akurat mam zmontowane i oryginalną stację odczytującą dane z tej samej bezprzewodowej sondy.

czwartek, 4 lipca 2013

wyświetlacz LCD po I2C i zegar RTC - testowanie zabawek

Wstęp

Nadszedł czas na testowanie zabawek zakupionych wcześniej. Na pierwszy ogień poszły:
  • przystawka do wyświetlacza LCD o symbolu I2C lcd1602
  • zegar RTC oparty o układ DS1307
Poniżej zdjęcie zmontowanego układu:



piątek, 14 czerwca 2013

Promocyjne zakupy w nettigo

Zakupy

Dzięki temu, że mój artykuł dostał się na stronę główną majsterkowo.pl dostałem możliwość dokonania promocyjnych zakupów w sklepie internetowym nettigo.pl.
To wszystko z 50% zniżką:

poniedziałek, 10 czerwca 2013

niedziela, 26 maja 2013

Odczyt bezprzewodowej sondy temperatury i wilgotności

Krótkie wprowadzenie

Dawno mnie nie było, ale poważnym tematem się zająłem ;) i dlatego tyle to trwało.
Jak widać na blogu od jakiegoś czasu zajmuję się monitorowaniem warunków (temperatura, wilgotność) w mieszkaniu i na zewnątrz.
Jestem w posiadaniu stacji pogodowej (mniej więcej takiej http://www.biowin.pl/bioterm/elektroniczne-stacje-pogody/bezprzewodowy-barom--term--higrom-wew--zew-/bezprzew-stacja-pog-barometr-pogod-zeg-kal-rcc) z bezprzewodową sondą temperatury i wilgotności i postanowiłem nauczyć się odczytywać jej wskazania i przesyłać je do komputera.



niedziela, 28 kwietnia 2013

Pierwsza produkcyjna implementacja - dołożenie czujnika DHT22

Dołożenie czujnika

Nie było w planie użycie tego czujnika, ale skoro już przyszedł to ... :)
Układ z dołożonym czujnikiem DHT22

Kolejna porcja zabawek z Chin

Kilka dni temu otrzymałem kolejną porcję zabawek od dostawcy z Chin.
Tym razem przyszły:
  • nadajnik i odbiornik RF w paśmie 433 MHz
  • wyświetlacz LCD 2x16 znaków
  • czujnik temperatury i wilgotności DHT22

takie to oto zabawki





czwartek, 25 kwietnia 2013

DHT22 i lcd Display

Dzisiaj uruchomiłem czujnik temperatury i wilgotności DHT22, a potem wyświetlacz LCD. Nic ciekawego, jedno i drugie po prostu działa.

Następnie zbudowałem prosty termometr i wilgotnościomierz z wyświetlaczem.

sobota, 13 kwietnia 2013

Pierwsza produkcyjna implementacja - zasilanie

Zasilanie

Dzisiaj krótko.
Do zasilania zakupiłem układ MC 7805CTG oraz kondensator 100nF, podłączyłem wg poniższego schematu
układ z podłączonym zasilaniem

i działa :)

niedziela, 7 kwietnia 2013

Pierwsza produkcyjna implementacja - standard przesyłania danych i czas systemowy

Standard

Postanowiłem opracować prosty standard danych aby:
  • wyeliminować ewentualne dodatkowe teksty wprowadzane do strumienia danych przez programy jak cu
  • zapewnić kompatybilność rozwiązania w przyszłości kiedy dane będą się zmieniać


sobota, 6 kwietnia 2013

Pierwsza produkcyjna implementacja - komunikacja po rs232

Kabelek

Podczas prac nad połączeniem mojego atmega16 do komputera posiłkowałem się artykułem RS-232: Komunikacja ATmega8 z komputerem.

Do zrobienia wtyczki wykorzystałem trzy linie z taśmy (trzeba było chyba cztery albo pięć, ale o tym później), akurat kolory przewodów to czerwony, pomarańczowy i żółty. Przylutowałem je następująco:
  • czerwony - RXD - pin nr 2
  • pomarańczowy - TXD - pin nr 3
  • zółty - GND - pin nr 5
a następnie skręciłem wtyczkę.


Z drugiej strony przewodów przylutowałem goldpiny i zabezpieczyłem koszulkami termokurczliwymi.

Gotowy przewód prezentuje się następująco:
Przewód do podłączania układu do RS232
Przewód do podłączania układu do RS232

Reszta układu na płytce stykowej

Na początek zaprojektowałem sobie układ w programie fritzing.
Projekt układu we Fritzing

piątek, 5 kwietnia 2013

Pierwsza produkcyjna implementacja - komunikacja po rs232

Zakupy

Kupiłem dzisiaj części potrzebne żeby skomunikować kontroler z komputerem:
  • układ scalony MAX232
  • kilka kondensatorów
  • wtyczkę

czwartek, 4 kwietnia 2013

Pierwsza produkcyjna implementacja - programowanie mikrokontrolera

Zakupy

Okazało się, że aby zaprogramować mikrokontroler nie trzeba  nic kupować poza tym co mam czyli:
  • płytka stykowa
  • arduino uno r3
  • trochę kabelków
No to do dzieła

Programowanie

Informacji o tym jak zaprogramować mikrokontroler zacząłem szukać na stronie http://majsterkowo.pl, a konkretnie od artykułu Programowanie ATmega8A oraz ATmega328P za pomocą Arduino. Wywnioskowałem z niego, że po pierwsze to muszę mieć bootloader, który później wgram. W artykule były linki do bootloaderów do dwóch innych kontrolerów, ale nie do atmega16 którego posiadałem. Zacząłem więc przeszukiwać internet w celu znalezienia odpowiedniego bootloadera i ... nie znalazłem.

Poprosiłem więc o pomoc na forum Majsterkowa - patrz wątek. Już po niecałych 24h dostałęm odpowiedź od kolegi czaja000. Wskazał mi artykuł z rozwiązaniem mojego problemu. Artykuł był ... tuż obok poprzedniego. Pod latarnią najciemniej :)

Podłączenie kabelków

Zmontowałem układ wg schematu:
Schemat połączeń


posiłkując się przy tym artykułami Programowanie mikrokontolerów na przykładzie ATTINY2313 oraz Opis wyprowadzeń Atmega16/Atmega32.

wtorek, 2 kwietnia 2013

Pierwsza produkcyjna implementacja - wybór i kupno mikrokontrolera

Mikrokontroler

Kupiłem ATMEGA16-16PU. 14 PLN kosztował w sklepie, nie wiem czy to najlepszy wybór, ale powinien się nadać.
Teraz trzeba się nauczyć jak go zaprogramować przy pomocy arduino i zrobić to, ale to już nie dzisiaj.

poniedziałek, 1 kwietnia 2013

Pierwsza produkcyjna implementacja - sprawdzenie czemu na wykresach brakuje danych

Co było powodem

Po "ciężkich" bojach z wykresami na których brakowało danych (patrz wpis Pierwsza produkcyjna implementacja - instalacja na Linuksie okazało się, że powodem jest zapisywanie liczb zmiennoprzecinkowych w zależności od jakichś ustawień lokalnych (czyli 0,5 zamiast 0.5).

sobota, 30 marca 2013

Pierwsza produkcyjna implementacja - instalacja na Linuksie

Uruchomienie platformy arduino na Linuksie

Na moim serwerze w domu chodzi akurat Ubuntu w wersji 12.04. Poniższy opis będzie się odnosił właśnie do tej platformy.

Na początek zainstalowałem menadżerem programów (synaptic) pakiet arduino, menadżer pakietów wskazał dodatkowe pakiety potrzebne do zainstalowania:
  • arduino - AVR development board IDE and built-in libraries
    • arduino-core - Code, examples, and libraries for the Arduino platform
    • avr-libc - Standardowa biblioteka C do programowania kontrolerów Amtel AVR
    • avrdude - Oprogramowanie do programowania mikrokontrolerów AVR firmy Atmel
    • binutils-avr - Binary utilities supporting Atmel's AVR targets
    • extra-xdg-menus - Extra menu categories for applications under GNOME and KDE
    • gcc-avr - Kompilator GNU C (kompilator krzyżowy do avr)
    • libftdi1 - Library to control and program the FTDI USB controller
    • libjna-java - Dynamic access of native libraries from Java without JNI
    • librxtx-java - Full Java CommAPI implementation
Sprawdziłem, że potrzebne byłyby jeszcze następujące pakiety, ale miałem je już zainstalowane:
  • default-jre
  • java6-runtime
  •  policykit-1
Dodatkowo zainstalowałem sobie:
  • fritzing - Easy-to-use electronic design software
    • fritzing-data - Easy-to-use electronic design software (data files)
  • rrdtool - time-series data storage and display system (programs)
  • drraw - A simple web based presentation front-end for RRDtool
Fritzinga do projektowania prototypów i płytek, rrdtool żeby wykresy robić i przy okazji drraw żeby zobaczyć co to jest, może łatwiej będzie się wykresy robić dzięki niemu.

Po  zainstalowaniu tego wszystkiego podpiąłem zestaw kablem USB zestaw do komputera, uruchomiłem Arduino IDE, poleceniem arduino ;), w Tools/Serial Port wybrałem /dev/ttyACM0 (pojawiło się to urządzenie po podpięciu arduino do komputera), uruchomiłem Serial Monitor i ...
Działające środowisko arduino na Linuksie

działa :)
Próba skompilowania i załadowania innego programu także się powiodła :)

czwartek, 28 marca 2013

Pierwsza produkcyjna implementacja - plan działania

Wstęp

Po zrobieniu działającego prototypu monitora temperatury opisanego w RRDTool i wykresy, którego efekty działania można obejrzeć na obrazkach poniżej
Wszystkie temperatury

Temperatura na zewnątrz
nadszedł czas na wykonanie tego projektu produkcyjnie czyli:
  1. całość działa całkowicie bezobsługowo, wystarczy załączyć zasilanie i już,
  2. wyniki działania dostępne są przez przeglądarkę (także z internetu),
  3. nie jest użyte arduino, ono posłuży do kolejnych prototypów.

Oszczędzanie energii - część II

Witam,

Tak mi się jakoś wierzyć nie chciało, że nie da się oszczędzać energii w arduino (patrz wpis Oszczędzanie energii).

I okazało się, że oczywiście się da :)
Trzeba skorzystać z biblioteki avr\sleep.h
Dla mojego arduino są tam zdefiniowane takie tryby oszczędzania energii jak:
  • SLEEP_MODE_IDLE
  • SLEEP_MODE_ADC
  • SLEEP_MODE_PWR_DOWN
  • SLEEP_MODE_PWR_SAVE
  • SLEEP_MODE_STANDBY
  • SLEEP_MODE_EXT_STANDBY
Nie wiem jeszcze czym dokładnie się różnią i które np da się przerwaniem zegarowym przerwać, a które tylko hardwerowo, ale wstępne pomiary amperomierzem pokazują, że tryby te rzeczywiście oszczędzają energię :)

niedziela, 24 marca 2013

RRDTool i wykresy


Dzisiaj napiszę kilka słów o wykresach.
Kupiłem cztery czujniki temperatury d18b20. Przykład ich podłączenia jest np tu. W sumie w sieci jest wiele takich przykładów.

Teraz chcę napisać nie jak zmierzyć temperaturę tylko jak narysować wykres tej temperatury. Najpierw napisałem programik, o taki:
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 12

#define MAX_NUM_OF_DEVICES 8


// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress arrTempDeviceAddress [MAX_NUM_OF_DEVICES];


// odstęp między pomiarami
#define ODSTEP_MIEDZY_POMIARAMI 60000


unsigned long ostatniCzasPomiaru = 0;


void setup(void)
{
  // start serial port
  Serial.begin(57600);

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  if (numberOfDevices > MAX_NUM_OF_DEVICES)
    numberOfDevices = MAX_NUM_OF_DEVICES;
  
  for (int i = 0; i < numberOfDevices; i++)
  {
    // Search the wire for address
    if (sensors.getAddress(arrTempDeviceAddress [i], i))
    {
      sensors.setResolution(arrTempDeviceAddress [i], TEMPERATURE_PRECISION);
    }
  }
}


void loop(void)
{ 
  unsigned long czasPomiaru = millis();

  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  
  Serial.print(czasPomiaru);
  Serial.print(";");

  // Loop through each device, print out temperature data
  for(int i = 0; i < numberOfDevices; i++)
  {
    float tempC = sensors.getTempC(arrTempDeviceAddress [i]);
    if (tempC > -127.0) // -127.0 to brak odczytu z sensora
      Serial.print(tempC);
    Serial.print(";");
  }
  
  Serial.println();
  
  
  // obliczenie ile czasu czekać do następnego pomiaru
  
  long waitTime = ODSTEP_MIEDZY_POMIARAMI - (millis() - ostatniCzasPomiaru);

 
  ostatniCzasPomiaru += ODSTEP_MIEDZY_POMIARAMI;
  
  if (waitTime > 0) 
    delay (waitTime);
  
}
Program raz na minutę wysyła na RS232 informację o czasie od uruchomienia w milisekundach i wartości pomiarów z czterech czujników, coś takiego konkretnie:
492;-7.75;21.69;19.37;39.44;
60000;-7.88;21.69;19.37;38.94;
120000;-7.81;21.62;19.37;38.50;
...
Przechwytuję te wartości przy pomocy programu CoolTerm i zapisuję do pliku.
Można je następnie wkleić do np LibreOffice Calc i uzyskać taki wykres
Wykres z LibreOffice Calc
Wykres całkiem ładny jednak trzeba się trochę narobić aby go zrobić. Może i niedużo ale jednak. A ja chciałbym aby taki wykres sam się robił i jeszcze publikował gdzieś gdzie będzie dla mnie dostępny online.

I tu z pomocą przyszło mi narzędzie RRDTool. Bardzo (ale to bardzo) ogólnie mówiąc jest to narzędzie, które potrafi zbierać dane i tworzyć raporty (także w postaci wykresów).

Po napisaniu kilku prostych skryptów (windowsowe cmd + gawk) otrzymałem taki efekt:


Pełny zbiór kodów dostępny jest tutaj.

W dalszej części zajmę się publikowaniem tych wykresów w sieci oraz jakimś sposobem aby dane pomiarowe lądowały od razu w sposób automatyczny w bazie RRDTool i były publikowane na serwerze www.

Jeżeli Was to interesuje i chcielibyście wiedzieć coś więcej proszę o pytania.

sobota, 23 marca 2013

Podłączanie wyświetlacza led

Zrobiłem sobie monitor temperatury w domu, cztery czujniki ds18b20 podłączone przez skrętkę monitorują temperaturę w mieszkaniu i na zewnątrz - ale to temat na osobny artykuł.

Teraz chciałem się podzielić pewnym doświadczeniem, kupiłem tani wyświetlacz led ldd055bg. Podłączyłem zaledwie jedną cyfrę do rejestru przesuwnego i ... zużyłem większość kabelków z zestawu startowego, a całość wygląda tak:

Chciałem jeszcze podłączyć drugą cyfrę przez ten drugi scalak z zestawu startowego, ale chyba sobie już dzisiaj odpuszczę i zajmę się tematem pobierania danych z rs232 i publikowania ich automatycznie w postaci wykresów. Jak będzie sukces to się podzielę.

Oszczędzanie energii

Jestem po pierwszych zabawach z arduino czyli czujnikami temperatury, diodami, odbiornikiem podczerwieni itp postanowiłem opisać swoje pierwsze rozważania na temat poboru energii przez układ.

Budując układ do pomiaru temperatury (patrz Jak mierzyć temperaturę z Arduino) napisałem prosty program
#define TEMP_PIN 2

void setup()
{
  Serial.begin(57600);
}


void loop()
{
  float wart = analogRead(TEMP_PIN);
  float temp = ((wart * 5.0 / 1024.0) - 0.5) / 0.01;

  Serial.print(temp);
} 
i zauważyłem, że kolejne pomiary potrafią się czasem sporo różnić mimo, że temperatura czujnika tak naprawdę się nie zmienia. No cóż, pewnie napięcie na usb niezbyt stabilne jest więc stąd te niedokładności. Aby je usunąć zrobiłem małą zmianę w programie, a mianowicie:

#define TEMP_PIN 2
#define INTERVAL 60000

unsigned long lastTime = 0;
unsigned long count = 0;
unsigned long value_sum = 0;


void setup()
{
  Serial.begin(57600);
}


void loop()
{
  int value = analogRead(TEMP_PIN);
  value_sum += value;
  
  count ++;
  
  unsigned long time = millis();
  
  if (time - lastTime > INTERVAL)
  {
    float temp = (((value_sum) * 5.0 / 1024.0 / count) - 0.5) / 0.01;

    Serial.print(temp);
    Serial.print(";");
    Serial.print(count);

    Serial.println();

    lastTime = time;
    count = 0;
    value_sum = 0;
  }
}

zmianę, która jak łatwo zauważyć przez minutę liczy średnią, a następnie wypisuje ją oraz liczbę pomiarów.W ciągu minuty na moim arduino liczba pomiarów w ciągu minuty to prawie 500 tys. Zaczęło mnie zastanawiać czy tak duża liczba pomiarów jest potrzebna. Intuicja mi bowiem podpowiadała, że każdy taki pomiar zużywa energię, a arduino z baterii potrafi być zasilane więc dobrze aby na niej długo działało.
Po nieco trudnej ale ciekawej lekturze dwóch artykułów:
wyszło mi, że wystarczy ich o wiele mniej. Powiedzmy 10 tys. aby uzyskać dokładność na poziomie 0,01 stopnia - mam na myśli wyeliminowanie wahań odczytów.

Pytanie jednak brzmi czy zmniejszenie liczby pomiarów poprzez wstawienie instrukcji 'delay' na końcu metody loop zmniejszy pobór energii. Arduino podłączone do 9V baterii wykonując powyższy program pobiera 47,1 mA. Po dodaniu na końcu instrukcji
  delay (6); 
liczba pomiarów spada do 9800, a pobór prądu ... rośnie do 47,8 mA.

No i to by było na tyle w temacie oszczędzania energii. Szczerze mówiąc zawiedziony jestem, taki fajny algorytm dynamicznego dostosowywania liczby pomiarów do aktualnych warunków w głowie miałem.

Do tematu jednak zamierzam wrócić bo to się wierzyć nie chce, że nie da się postawić układu w stan zawieszenia kiedy zapotrzebowanie na energię jest minimalne

wtorek, 19 marca 2013

Wstęp do tego wszystkiego

Witam Was

od dłuższego czasu nosiło mnie żeby rozpocząć zabawę z elektroniką, a konkretnie z mikro-kontrolerami.

Ostatnio kupiłem zestaw startowy Arduino i ... zabawa się zaczęła.

Tu zamierzam opisywać moje doświadczenia. Ale to za chwilę jak tylko przestanę się bawić ;)


pozdrawiam
Jacek

ps
tak w ogóle to mój pierwszy blog więc proszę o wyrozumiałość