Σχεδιάζουμε και δημιουργούμε έναν σταθμό ο οποίος θα μετράει τις συνθήκες στις σχολικές τάξεις (θερμοκρασία, υγρασία, ποιότητα αέρα, θόρυβο, φως) και θα τις καταγράφει σε μια διαδικτυακή βάση δεδομένων.
Breadboard
Αρχικά θα συνδέσουμε το breadboard με το Arduino. Επειδή είναι πιθανό να συνδέσουμε και μονάδες που λειτουργούν με ρεύμα τάσης 3.3V θα δώσουμε σε κάθε ράγα του breadboard διαφορετικό ρεύμα.
Σύνδεση και δοκιμή οθόνης
Βασικό κομμάτι του σταθμού θα είναι μια οθόνη πληροφοριών η οποία θα συνδέεται με το Arduino με την χρήση του πρωτοκόλλου I2C, χρησιμοποιώντας τις θύρες SDA (Data) και SCL (Clock) του Arduino. To SDA της οθόνης θα συνδεθεί με την Α4 του Arduino και το SCL με την A5. Επειδή υπάρχει η πιθανότητα να προσθέσουμε και άλλες I2C συσκευές θα χρησιμοποιήσουμε το breadboard για να κάνουμε τις συνδέσεις αυτές.
Πάμε τώρα στο Arduino IDE. Θα χρειαστεί να προσθέσουμε την βιβλιοθήκη LiquidCrystal I2C αν δεν την έχουμε ήδη εγκαταστήσει
Αφού την κάνουμε εγκατάσταση μπορούμε να ανοίξουμε το παράδειγμα HelloWorld και να το δοκιμάσουμε.
Το πρόγραμμα αυτό χρησιμοποιεί την βιβλιοθήκη LiquidCrystal I2C καθώς και την Wire η οποία χρειάζεται για την I2C επικοινωνία.
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Hello, world!");
lcd.setCursor(2,1);
lcd.print("Ywrobot Arduino!");
lcd.setCursor(0,2);
lcd.print("Arduino LCM IIC 2004");
lcd.setCursor(2,3);
lcd.print("Power By Ec-yuan!");
}
void loop()
{
}
Και φυσικά μπορούμε να δοκιμάσουμε τα δικά μας κείμενα.
Σύνδεση μονάδας Real Time Clock
Η μονάδα RTC που έχουμε (DS1302 RTC της WaveShare) συνδέεται με το Arduino ακολουθώντας το πρωτόκολλο επικοινωνίας SPI. Οι συνδέσεις που πρέπει να κάνουμε είναι οι εξής:
- VCC: Με τα 5V του Arduino.
- GND: Με την γείωση GND του Arduino.
- MISO: Με το Pin 12 (SPI MISO).
- MOSI: Με το Pin 11 (SPI MOSI).
- SCK: Με το Pin 13 (SPI SCK).
- CS: Με το Pin 10.
Τώρα θα πάμε στο Arduino IDE και θα εγκαταστήσουμε την βιβλιοθήκη DS1302
Αφού κάνουμε εγκατάσταση την βιβλιοθήκη μπορούμε τώρα να γράψουμε ένα πρόγραμμα το οποίο να ρυθμίζει την ώρα και την ημερομηνία.
/** SetDateTime.cpp
*
* Example of setting the date and time to the RTC.
*
* @version 1.0.1
* @author Rafa Couto <caligari@treboada.net>
* @license GNU Affero General Public License v3.0
* @see https://github.com/Treboada/Ds1302
*
*/
#include <Arduino.h>
#include <Ds1302.h>
// DS1302 RTC instance
Ds1302 rtc(10, 13, 11);
uint8_t parseDigits(char* str, uint8_t count)
{
uint8_t val = 0;
while(count-- > 0) val = (val * 10) + (*str++ - '0');
return val;
}
void setup()
{
// initialize the RTC
rtc.init();
Serial.begin(9600);
Serial.println("Input the date and time (YYMMDDWhhmmss): ");
}
void loop()
{
static char buffer[13];
static uint8_t char_idx = 0;
if (char_idx == 13)
{
// structure to manage date-time
Ds1302::DateTime dt;
dt.year = parseDigits(buffer, 2);
dt.month = parseDigits(buffer + 2, 2);
dt.day = parseDigits(buffer + 4, 2);
dt.dow = parseDigits(buffer + 6, 1);
dt.hour = parseDigits(buffer + 7, 2);
dt.minute = parseDigits(buffer + 9, 2);
dt.second = parseDigits(buffer + 11, 2);
// set the date and time
rtc.setDateTime(&dt);
char_idx = 0;
}
if (Serial.available())
{
buffer[char_idx++] = Serial.read();
}
}
Με αυτό το πρόγραμμα μπορούμε να χρησιμοποιήσουμε το Serial Monitor για να ορίσουμε την ώρα και την ημερομηνία. Εκεί θα πρέπει να βάλουμε την ημερομηνία με την εξής μορφή: Τα πρώτα δύο ψηφία θα είναι η χρονιά (24), μετά τα επόμενα 2 ο μήνας (12), μετά η ημέρα (04), μετά ποια ημέρα της εβδομάδας είναι (3 για Τετάρτη), μετά η ώρα (πχ 17) μετά τα λεπτά (πχ 35) και τέλος τα δευτερόλεπτα (πχ 20).
Πάμε τώρα να βάλουμε ένα πρόγραμμα για να δείχνει την ώρα και την ημερομηνία στην οθόνη.
#include <Arduino.h>
#include <Ds1302.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
// DS1302 RTC instance
Ds1302 rtc(10, 13, 11);
const static char* WeekDays[] =
{
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
void setup()
{
Serial.begin(9600);
lcd.init(); // initialize the lcd
// initialize the RTC
rtc.init();
// test if clock is halted and set a date-time (see example 2) to start it
if (rtc.isHalted())
{
Serial.println("RTC is halted. Setting time...");
Ds1302::DateTime dt = {
.year = 17,
.month = Ds1302::MONTH_OCT,
.day = 3,
.hour = 4,
.minute = 51,
.second = 30,
.dow = Ds1302::DOW_TUE
};
rtc.setDateTime(&dt);
}
}
void loop()
{
// get the current time
Ds1302::DateTime now;
rtc.getDateTime(&now);
static uint8_t last_second = 0;
if (last_second != now.second)
{
last_second = now.second;
String printDate = String(WeekDays[now.dow - 1]) + ", " + String(now.day) + "/" + String(now.month) + "/" + String(now.year);
String printHour = String(now.hour) + ":" + String(now.minute) + ":" + String(now.second);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(printDate);
lcd.setCursor(0,1);
lcd.print(printHour);
}
delay(1000);
}
Σύνδεση μονάδας θερμοκρασίας και υγρασίας DHT11
Για την παρακολούθηση της θερμοκρασίας και υγρασίας που υπάρχει στην αίθουσα θα χρησιμοποιήσουμε τον αισθητήρα DHT11. Η σύνδεση του θα γίνει ως εξής:
- Από το VCC ή την ένδειξη + της μονάδας θα συνδέσουμε ένα κόκκινο καλώδιο στα 5V του breadboard
- Από το GND ή την ένδειξη – της μονάδας θα συνδέσουμε ένα μαύρο καλώδιο στην γείωση (GND) του breadboard
- Από το OUT της μονάδας θα συνδέσουμε καλώδια με την θύρα 3 του Arduino
Αφού συνδέσουμε τα καλώδια, το επόμενο βήμα είναι να προσθέσουμε την βιβλιοθήκη για τον αισθητήρα στο Arduino IDE. Διαλέγουμε την βιβλιοθήκη DHT11 by Druba Saha και την κάνουμε εγκατάσταση.
Τώρα θα τροποποιήσουμε το πρόγραμμα μας έτσι ώστε να δείχνει στην οθόνη αρχικά την ώρα και την ημερομηνία για 2 δευτερόλεπτα και μετά την θερμοκρασία και την υγρασία για 2 δευτερόλεπτα.
#include <Arduino.h>
#include <Ds1302.h>
#include <LiquidCrystal_I2C.h>
#include <DHT11.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
// DS1302 RTC instance
Ds1302 rtc(10, 13, 11);
//DHT11 instance
DHT11 dht11(3);
const static char* WeekDays[] =
{
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
void setup()
{
Serial.begin(9600);
lcd.init(); // initialize the lcd
// initialize the RTC
rtc.init();
// test if clock is halted and set a date-time (see example 2) to start it
if (rtc.isHalted())
{
Serial.println("RTC is halted. Setting time...");
Ds1302::DateTime dt = {
.year = 17,
.month = Ds1302::MONTH_OCT,
.day = 3,
.hour = 4,
.minute = 51,
.second = 30,
.dow = Ds1302::DOW_TUE
};
rtc.setDateTime(&dt);
}
}
void loop()
{
int temperature = 0;
int humidity = 0;
// Attempt to read the temperature and humidity values from the DHT11 sensor.
int result = dht11.readTemperatureHumidity(temperature, humidity);
// get the current time
Ds1302::DateTime now;
rtc.getDateTime(&now);
static uint8_t last_second = 0;
if (last_second != now.second)
{
last_second = now.second;
String printDate = String(WeekDays[now.dow - 1]) + ", " + String(now.day) + "/" + String(now.month) + "/" + String(now.year);
String printHour = String(now.hour) + ":" + String(now.minute) + ":" + String(now.second);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(printDate);
lcd.setCursor(0,1);
lcd.print(printHour);
}
delay(2000);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Temp:");
lcd.setCursor(6,0);
lcd.print(temperature);
lcd.setCursor(0,1);
lcd.print("Hum:");
lcd.setCursor(4,1);
lcd.print(humidity);
delay(2000);
}
Μέτρηση φωτεινότητας αίθουσας
Είναι σημαντικό να χρησιμοποιήσουμε έναν αισθητήρα φωτός που μπορεί να μετατρέψει τις τιμές σε μονάδες φωτεινότητας (LUX). Μια πιθανή λύση είναι ο αισθητήρας I2C – TSL25911 της Waveshare οποίος κοστίζει περίπου 5 ευρώ. Συνδέεται εύκολα και έχει την δική του βιβλιοθήκη.
Μέτρηση σκόνης και αιωρούμενων σωματιδίων
Για την μέτρηση των αιωρούμενων σωματιδίων μπορούμε να χρησιμοποιήσουμε τον αισθητήρα σκόνης της Waveshare ο οποίος κοστίζει περίπου 18 ευρώ.
Πιο καλή λύση για μεγαλύτερη απόδοση είναι η χρήση του αισθητήρα Particulate Matter Sensor PMS5003 μαζί με το breakout board τα οποία συνολικά κοστίζουν περίπου 35 ευρώ.