Главная chevron_right Наши уроки chevron_right Arduino chevron_right Урок 21.1 Метеостанция с сохранением данных на flash карту

Урок 21.1 Метеостанция с сохранением данных на flash карту

Собираем метеостанцию на Arduino Uno: подключаем датчики DHT22, освещённости и RTC DS1307, выводим данные на LCD1602 и каждые 5 минут сохраняем показания на MicroSD карту

Видео-обложка запускается при наведении

В этом уроке мы научимся не только получать и выводить данные с датчиков и модулей на дисплей, но и сохранять эти данные на MicroSD карте.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
  • Библиотека iarduino_DHT (для работы с датчиками температуры и влажности DHT11, DHT22)
  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C) (Библиотека SD, для работы с адаптером MicroSD-карт, входит в стандартный набор Arduino IDE > Скетч> Подключить библиотеку > SD.)

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.

Видео:

Схема подключения:

Подключение модулей RTC и LCD, осуществляется к аппаратным выводам шины I2C. Подключение адаптера,осуществляется к аппаратным выводам шины SPI. Trema-модуль датчик света подключается к аналоговому входу A0 (можно менять в скетче). Trema-модуль DHT22 (датчик температуры и влажности) подключается к цифровому выводу 2 (можно менять в скетче).

Метеостанция на Arduino Uno

RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602Arduino Uno
GNDGND
Vcc+5V
SDA (Serial DAta)A4
SCL (Serial CLock)A5
Адаптер карт MicroSDArduino Uno
CS (Chip Select)10
SCK (Serial ClocK)13
MOSI (Master Out Slave In)11
MISO (Master In Slave Out)12
Vcc5V
GNDGND
Датчики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
}

скачать.

Ссылки:

Комплект для повторения проекта

Что понадобится

Это быстрый ориентир по основным модулям и деталям. Полный список для повторения проекта смотрите в самой статье.

12 позиций
Arduino Uno R3 (USB ATmega16U2) Платформа c микроконтроллером ATmega328P на ядре AVR с чипом USB ATmega16U2 для разработки электронных устройств на языке C++ Открыть в iArduino SPI адаптер карт MicroSD v1.0 для Arduino (Работает с официальными программами Arduino) адаптер карт MicroSD v1.0 Открыть в iArduino Символьный дисплей LCD1602 I²C (Синяя подсветка) Текстовый экран с управлением по I²C на 2 строки по 16 символов с белым текстом на синей подсветке Открыть в iArduino Символьный дисплей LCD1602 I²C (Зелёная подсветка) Текстовый экран с управлением по I²C на 2 строки по 16 символов с чёрным текстом на зелёной подсветке Открыть в iArduino Часы реального времени RTC DS1307Z (Trema-модуль) Электронный энергонезависимый хронометр на чипе DS1307Z Открыть в iArduino Цифровой датчик температуры и влажности высокой точности (Trema-модуль) Позволяет получать показания температуры и влажности по одной линии данных. Открыть в iArduino Датчик освещённости (Trema-модуль) Trema-модуль Датчик освещённости Открыть в iArduino i2C Hub Будет полезен в проектах с большим количеством устройств с интерфейсом I2C Открыть в iArduino Trema Shield Плата расширения для удобного подключения периферийных устройств Открыть в iArduino Соединительные провода «папа-мама» (40 шт. / 20 см) Шлейф из 40 проводов «папа-мама» длиной 20 см для прототипирования электронных устройств Открыть в iArduino Шлейф Dupont «Мама – Мама» (4 pin, 20 см) Шлейф из четырёх проводов длиной 20 см с коннекторами Dupont Female Открыть в iArduino Цифровой датчик температуры и влажности (Trema-модуль) Trema-модуль DHT11 Открыть в iArduino
Все уроки Arduino