КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

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

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

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

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

  • Библиотека 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 (можно менять в скетче).

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

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
}

скачать.

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями