2024. április 26., péntek

Gyorskeresés

Útvonal

Cikkek » Számtech rovat

Ujjgyakorlatok Arduino alapon

  • (f)
  • (p)
Írta: |

Ismerkedés a mikrokontrollerrel: időjárás-állomás és öntözőrendszer tapasztalat nélkül!

[ ÚJ TESZT ]

Időjárás-állomás

Barkácsboltban, lakberendezési boltokban néhány ezer forintért már lehet kapni különböző légköri paramétereket mérő és kijelző készülékeket. Szépek, jók, talán pontosak is, de hol marad a barkácsolás öröme? Ha van egy kis barkácshajlamunk, és utánajárunk, akkor nekünk tetsző tulajdonságokat kijelző rendszerünk lehet. Nem lesz olcsóbb, de olyan szintre bővíthetjük, és olyan egyéb dolgokat tehetünk rá, amit egy kész eszközre nem.

Légköri jellemzők

Mi mindent lehet mérni a levegőből? A 3 alapvetőt szerintem mindenki tudja: hőmérséklet, páratartalom, légnyomás. Emellett a pontos időt is ki lehet jelezni. Lássuk, mi minden kell hozzá:

- egy mikrokontroller, esetünkben ATmega328 chippel. Nálam egy Nano üzemel.

Arduino Nano

Arduino Nano

- egy páratartalom-mérő, pl. egy DHT11, vagy DHT22, ebben hőmérő is van

DHT22, vagy tokozva AM2302

- egy légnyomásmérő, egy BMP085. Ebben is van hőmérő :)

BMP085

- egy valós idejű óramodul, nekem egy DS1307 chipes jutott

RTC modul

RTC modul

- egy kijelző, itt nagy a választék. Az én választásom egy 20 x 4 karakteres, I2C kivezetésű LCD-re esett.

2004 I2C LCD

az LCD hátoldala az I2C modullal

- a logoláshoz egy SD modul, kártyával.

Van olcsóbban I2C nélküli változat is, ez több digitális kimenetet igényel, de ha másra úgyse használjuk, akkor ez is tökéletes.
Ezek mellett természetesen kell tápellátás, némi vezeték, illetve egy próbapanel.

kábeldzsungel...

Összeszerelés

A légnyomásmérő, az óra, és a kijelző is I2C -vel kommunikál, ami az Arduino A4 és A5 kivezetésein található. A páratartalom-mérő egy digitális bemenetet igényel, esetemben a D2-re tettem. A tápot minden esetben a lap 5 V-os ágáról veszem, úgy tűnik, bírja. A páratartalom-mérő kivételével mindegyik egyszerű legó, csak itt kell egy plusz ellenállást beiktatni (bár nélküle is ment, de ha azt írják, hogy kell, akkor hadd legyen ott).

A szoftver

Na jó, ez kicsit nagyképű dolog szoftvernek nevezni, inkább programocska :) Igen egyszerű, kevés kommenttel is megérthető.

#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//#include <BMP085.h>
#include "RTClib.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
File myFile;
char temperature[6];
char pressure[8];
char humidity[6];

const int chipSelect = 4;

Adafruit_BMP085 bmp = Adafruit_BMP085(10085);


//RTC_Millis RTC;
RTC_DS1307 RTC;

//BMP085 dps = BMP085(); // Digital Pressure Sensor

//long Temperature = 0, Pressure = 0, Altitude = 0;

LiquidCrystal_I2C lcd(0x20,20,4); // set the LCD address to 0x20 for a 16 chars and 2 line display
int savecount = 0;
int savedelay = 2; // kb. ennyiszer 10 másodpercenként ír adatot a kártyára.
int p;

#define DHTPIN 2 // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

void setup() {
lcd.init();

Serial.begin(9600);
Serial.println("DHTxx test!");
lcd.backlight();
Wire.begin();
delay(1000);
dht.begin();
// RTC.adjust(DateTime(__DATE__, __TIME__));

if(!bmp.begin())
{
/* There was a problem detecting the BMP085 ... check your connections */
Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
while(1);
}
pinMode(10, OUTPUT); // change this to 53 on a mega
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
}


void loop() {
String dataString = "";

// dps.getPressure(&Pressure);
// dps.getAltitude(&Altitude);
// dps.getTemperature(&Temperature);

// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
float t = dht.readTemperature();

DateTime now = RTC.now();
/* Get a new sensor event */
sensors_event_t event;
bmp.getEvent(&event);

// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print("%");
// lcd.print(" %\t");
lcd.setCursor(0,2);

lcd.print("Temp: ");
lcd.print(t);
lcd.print(" deg C");
lcd.setCursor(0,3);
// lcd.print("Pressure: ");
// lcd.print(Pressure/100);
// lcd.print(" mbar");
if (event.pressure)
{
/* Display atmospheric pressue in hPa */
lcd.print("Press: ");
lcd.print(event.pressure);
p = event.pressure;
lcd.print(" hPa");
}
delay(10000);
}
savecount++;
if (savecount == savedelay){
savecount = 0;
dataString = "";
File dataFile = SD.open("datalog.txt", FILE_WRITE);
dataString += String(now.year(), DEC);
dataString += "/";
dataString += String(now.month(), DEC);
dataString += "/";
dataString += String(now.day(), DEC);
dataString += " ";
dataString += String(now.hour(), DEC);
dataString += ":";
dataString += String(now.minute(), DEC);
dataString += ":";
dataString += String(now.second(), DEC);
dataString += "; ";
dataString += "H: ";
dtostrf(h,2,2,humidity);
dataString += String(humidity);
dataString += "; ";
dataString += "T: ";
dtostrf(t,2,2,temperature);
dataString += String(temperature);
dataString += "; ";
dataString += "P: ";
dtostrf(p,2,2,pressure);
dataString += String(pressure);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
}
}

Ennek az eredménye a fent is látható képhez hasonló kiírás, valamint a kártyán egy datalog.txt nevű fájl, benne soronként az idő és a mért értékek.

Ez így magában kevés, kell hozzá az Arduino szoftver, illetve függvénykönyvtárak. Az Arduino aktuális, 1.0.5-ös verzióját az arduino.cc oldalról tölthetjük le. A szükséges függvénykönyvtárak:
RTClib
LiquidCrystalI2C
BMP085 (szükség van hozzá az Unified Sensor libraryra)
DHT
a wire és az SD könyvtárak a fordítókörnyezettel együtt jönnek, azt nem kell külön telepíteni.

A valós idejű óra miatt egy kis cselt érdemes alkalmazni: be kell állítani az induló időpontot. Ezt egy igen egyszerű és rövid programmal megtehetjük (az RTClib példaprogramja alapján):

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

void setup () {
Serial.begin(57600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();

if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(__DATE__, __TIME__));
}
}

void loop () {
DateTime now = rtc.now();

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.println();
delay(3000);
}

Ebből is csak az iniciálás és a rtc.adjust(DateTime(__DATE__, __TIME__)); rész a lényeg, a többi csak körítés :) Először ezt töltsük fel, utána mehet a “fő” program.

Ennyi után már működik is egy alap készülék.

Kiegészítő lehetőségek

Mérhetjük pl. a fényerősséget, ezzel (ablak mellett, vagy kültéren) napos órák számát, kis trükkel és 1-2 jól beállított tükörrel a napkelte és napnyugta idejét, vagy a csapadék mennyiségét. akár egyből továbbíthatjuk is vezetéken, vagy vezeték nélkül. Ez talán a jövőben egy következő blog témája lesz :)

A cikk még nem ért véget, kérlek, lapozz!

Azóta történt

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.