В этом уроке мы научимся не только получать и выводить данные с датчиков и модулей на дисплей, но и сохранять эти данные на MicroSD карте.
Нам понадобится:
- Arduino Uno х 1шт.
- SPI адаптер карт MicroSD v1.0 х 1шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
- Trema-модуль RTC (часы реального времени) на базе чипа DS1307 х 1шт.
- Trema-модуль DHT22 (датчик температуры и влажности) х 1шт.
- Trema-модуль Датчик освещённости х 1шт.
- Trema-модуль I2C Hub х 1шт.
- Trema Shield х 1шт.
- 6 проводной шлейф ПАПА-МАМА для подключения х 1шт.
- 4 проводной шлейф МАМА-МАМА для подключения х 2шт.
Остальные провода входят в комплект Trema-модулей
Trema-модуль DHT22 можно заменить на Trema-модуль DHT11
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
- Библиотека iarduino_DHT (для работы с датчиками температуры и влажности DHT11, DHT22)
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)
(Библиотека SD, для работы с адаптером MisroSD-карт, входит в стандартный набор Arduino IDE > Скетч> Подключить библиотеку > SD.)
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.
Видео:
Схема подключения:
Подключение модулей RTC и LCD, осуществляется к аппаратным выводам шины I2C.
Подключение адаптера,осуществляется к аппаратным выводам шины SPI.
Trema-модуль датчик света подключается к аналоговому входу A0 (можно менять в скетче).
Trema-модуль DHT22 (датчик температуры и влажности) подключается к цифровому выводу 2 (можно менять в скетче).
| RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602 | Arduino Uno |
|---|---|
| GND | GND |
| Vcc | +5V |
| SDA (Serial DAta) | A4 |
| SCL (Serial CLock) | A5 |
| Адаптер карт MicroSD | Arduino Uno |
|---|---|
| CS (Chip Select) | 10 |
| SCK (Serial ClocK) | 13 |
| MOSI (Master Out Slave In) | 11 |
| MISO (Master In Slave Out) | 12 |
| Vcc | 5V |
| GND | GND |
| Датчики | Arduino Uno |
|---|---|
| Trema-модуль датчик света | A0 |
| Trema-модуль DHT22 (датчик температуры и влажности) | 2 |
Алгоритм работы метеостанции:
- При старте, в течении 2 секунд, метеостанция выводит информацию о том, подключена ли SD-карта ("ON"/"ERR").
- Каждую секунду, метеостанция опрашивает подключённые датчики и выводит информацию на LCD дисплей.
- Каждые 5 минут информация сохраняется на SD-карту, добавляя новую строку в файл "iarduino.txt" в корне SD-карты.
Код программы:
// Подключаем библиотеки:
#include <Wire.h> // подключаем библиотеку для работы с шиной I2C (для LCD дисплея)
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для работы с LCD дисплеем
#include <SPI.h> // подключаем библиотеку для работы с шиной SPI (для адаптера карт MicroSD)
#include <SD.h> // подключаем библиотеку для работы с адаптером карт MicroSD
#include <iarduino_DHT.h> // подключаем библиотеку для работы с датчиком DHT
#include <iarduino_RTC.h> // подключаем библиотеку для работы с RTC модулем
// Объявляем переменные и константы:
int8_t DHT_result; // объявляем переменную для хранения состояния опроса датчика DHT
uint16_t LUM_result; // объявляем переменную для хранения результата опроса датчика освещённости
bool MSD_result; // объявляем переменную для хранения состояния адаптера карт MicroSD
uint8_t LCD_symbol[8] = {B00110,B01001,B01001,B00110,B00000,B00000,B00000,B00000}; // символ градуса
const uint8_t PIN_temperature = 2; // номер цифрового вывода к которому подключён датчик DHT
const uint8_t PIN_adapterSD_CS = 10; // указываем номер вывода CS шины SPI инициирующего передачу данных с адаптером карт MicroSD
const uint8_t PIN_illumination = 0; // номер аналогового вывода к которому подключён освещенности
LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля (DS1307)
iarduino_DHT sensor(PIN_temperature); // объявляем переменную для работы с датчиком DHT, указывая номер цифрового вывода к которому подключён датчик
File myFile; // объявляем переменную myFile класса File, которая будет служить "указателем" на открытый файл
void setup(){
MSD_result = SD.begin(PIN_adapterSD_CS); // инициируем SD карту с указанием номера вывода CS
time.begin(); // инициируем RTC модуль
lcd.init(); // инициируем LCD дисплей
lcd.backlight(); // включаем подсветку LCD дисплея
lcd.createChar(1, LCD_symbol); // загружаем символ градус
lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0
lcd.print(F("iArduino.ru")); // выводим текст "iArduino.ru"
lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1
lcd.print(F("SD-card ")); // выводим текст "SD-card"
lcd.print(MSD_result?"OK":"ERR"); // выводим состояние карты MicroSD: "OK" или "ERR"
delay(2000); // ждём 2 секунды
lcd.clear(); // стираем информацию на дисплее
}
void loop(){
if(time.seconds!=atoi(time.gettime("s"))){ // выполняем скрипт один раз в секунду
// читаем данные с датчиков:
DHT_result = sensor.read(); // опрашиваем датчик DHT (влажность и температура)
LUM_result = 1024-analogRead(PIN_illumination); // опрашиваем датчик освещённости
// выводим информацию на LCD дисплей:
// выводим температуру:
lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0
lcd.print(F("t= \1C")); // выводим текст "t= °С"
lcd.setCursor(2, 0); // устанавливаем курсор в позицию: столбец 2, строка 0
if(DHT_result==DHT_OK){lcd.print(sensor.tem);} // выводим значение температуры
else {lcd.print(F("??.??"));} // выводим текст "??.??"
// выводим влажность:
lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1
lcd.print(F("PH= %")); // выводим текст "PH= %"
lcd.setCursor(3, 1); // устанавливаем курсор в позицию: столбец 3, строка 1
if(DHT_result==DHT_OK){lcd.print(sensor.hum);} // выводим значение влажности
else {lcd.print(F("??.??"));} // выводим текст "??.??"
// выводим освещённость:
lcd.setCursor(10, 0); // устанавливаем курсор в позицию: столбец 10, строка 0
lcd.print(F("*= ")); // выводим текст "*= "
lcd.setCursor(12, 0); // устанавливаем курсор в позицию: столбец 12, строка 0
lcd.print(LUM_result); // выводим значение освещённости
// выводим время:
lcd.setCursor(10, 1); // устанавливаем курсор в позицию: столбец 10, строка 1
lcd.print(time.gettime("H:i")); // выводим время
lcd.setCursor(12, 1); // устанавливаем курсор в позицию: столбец 12, строка 1
if(time.seconds%2){ lcd.print(" ");} // убираем знак ":" каждую нечётную секунду
// сохраняем информацию на SD-карту:
if(MSD_result){ // если SD-карта подключена
if(time.seconds==0){ // если секунды равны 00
if(time.minutes%5==0){ // если минуты кратны 5 (равны: 00,05,10,15,20,25,30,35,40,45,50,55)
myFile = SD.open(F("iarduino.txt"),FILE_WRITE); // если файла с именем "iarduino.txt" - нет, то он будет создан.
if(myFile){ // если файл доступен (открыт для записи), то ...
myFile.print(time.gettime("Y-m-d H.i:")); // записываем дату и время
myFile.print(F(" температура ")); // записываем температуру
myFile.print(sensor.tem);
myFile.print(F("°С, влажность ")); // записываем влажность
myFile.print(sensor.hum);
myFile.print(F("%, освещённость ")); // записываем освещенность
myFile.print(LUM_result);
myFile.println(".");
myFile.close(); // закрываем файл "iarduino.txt"
}
}
}
}
}else{delay(200);} // ждём 0.2 сек, разгружая шину I2C
}
Ссылки:
- Код программы.
- Библиотека iarduino_RTC.
- Библиотека iarduino_DHT.
- Библиотека LiquidCrystal_I2C_V112.
- Wiki - Установка библиотек в Arduino IDE.
- WiKi - Работа с символьными ЖК дисплеями.
- Wiki - Часы реального времени, RTC (Trema-модуль).
- Wiki - Датчики температуры и влажности DHT11/DHT22.
- Wiki - Trema Shield.


Обсуждение