В этом уроке мы научимся не только получать и выводить данные с датчиков и модулей на дисплей, но и сохранять эти данные на 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.
Обсуждение