ДАТЧИК ТЕМПЕРАТУРЫ С ЗАПИСЬЮ ДАННЫХ
Некоторое время назад я нашел интересную статью по созданию датчика, записывающего значение температуры. И, поскольку у меня под руками оказались нужные детали, то я спросил сам себя «Почему бы не сделать на Arduino часы с текущей датой, датчиком температуры и влажности и возможностью записывать эти данные?».
Так что, я модифицировал исходный код из статьи, добавив другую библиотеку для дисплея, чтобы я мог использовать свой LCD 16х2 I2C дисплей, и DHT11 библиотеку, по вполне понятным причинам.
Вместо датчика Холла я использовал обычную кнопку с нагрузочным резистором, чтобы была возможность на несколько секунд включить подсветку экрана.
Исходный код:
// ДАТЧИК ТЕМПЕРАТУРЫ И ВЛАЖНОСТИ С ВОЗМОЖНОСТЬЮ ЗАПИСИ ДАННЫХ И ДАТЫ И ВРЕМЕНИ ИХ ПОЛУЧЕНИЯ
// С ИСПОЛЬЗОВАНИЕМ ARDUINO UNO, 16X2 I2C LCD ДИСПЛЕЯ, DHT11 ДАТЧИКА
//
//Исходный код создан Husham Samir и находится наn instructables.com //
// http://www.instructables.com/id/Temperature-Data-Logger-1/ //
//
// Модифицирован Timofte Andrei 17 января 2015
// Заменена исходная библиотека Liquid Crystal для LCD дисплея на NewLiquidCrystal
// добавлена библиотека для dht11
// добавлена кнопка для включения LCD дисплея
//
// Для подробной информации смотрите ссылку ниже:
// https://timofteandreidiy.wordpress.com/2015/01/17/arduino-datalogger-with-dht11-sd-card-i2c-lcd-and-rtc-english/
//
// или
//
// https://www.youtube.com/watch?v=84qdtLBx3nk
//
// Sharing is caring!
//
// Модуль SD карты подключается следующим образом:
// ** MOSI - пин 11
// ** MISO - пин 12
// ** CLK - пин 13
// ** CS - пин 8
//Часы реального времени и I2C LCD дисплей
// SDA - пин A4
// SCL - пин A5
// Датчик DHT11
// Пин 1 - 5V
// Пин 2 - Data -> D2 на Arduino
// Пин 3 - NC
// Пин 4 - GND
// Кнопка
// A2]------------+
// R 10K | Ключ
// +5V--[===]-----+----[/]---+
// |
// GND-----------------------+
#include <dht11.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
#include <SD.h>
LiquidCrystal_I2C lcd(0x20, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE);
const int buttonPin = A2;
int buttonState = 0;
dht11 DHT11;
#define DHT11PIN 2
const int chipSelect = 10; //можетевыбратьлюбойдругойсвободныйцифровойпин
byte termometru[8] = //параметры по умолчанию для значка термометра
{
B00100,
B01010,
B01010,
B01010,
B01110,
B11111,
B11111,
B01110
};
byte picatura[8] = //параметры по умолчанию для значка водяной капли custom character for water drop
{
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110,
};
void setup() {
pinMode(buttonPin, INPUT);
lcd.begin(16, 2);
lcd.clear();
lcd.createChar(1,termometru);
lcd.createChar(2,picatura);
lcd.setCursor(0,0);
lcd.print("Initializing");
lcd.setCursor(3,1);
lcd.print("SD Card...");
delay(1000);
lcd.clear();
pinMode(10, OUTPUT); // необходимо для работы с библиотекой SD модуля
digitalWrite(10,HIGH);
// посмотрим, будет ли карта определена и инициализированна:
if (!SD.begin(chipSelect)) {
lcd.setCursor(4, 0);
lcd.print("SD Card");
lcd.setCursor(0, 1);
lcd.print("is not present");
// ничего больше не делать:
delay(3000);
return;
}
lcd.setCursor(4,0);
lcd.print("SD Card");
lcd.setCursor(0,1);
lcd.print("initialized");
delay(2000);
lcd.clear();
Wire.begin();
rtc.begin();
if (! rtc.isrunning()) {
lcd.clear();
lcd.print("RTC NOT Running");
//следующая строка устанавливает на часах дату и время, в которое скомпилирован скетч
// rtc.adjust(DateTime(__DATE__, __TIME__)); //использовать только, когда время и дата на часах устанавливаются в первый раз
}
// rtc.adjust(DateTime(__DATE__, __TIME__)); //используйте, если вам нужно точное время
delay(2000);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
//подсветка загорается на 3 сек после нажатия на кнопку
lcd.backlight();
delay(3000);
}
else {
//и выключается
lcd.noBacklight();
}
int chk = DHT11.read(DHT11PIN);
DateTime now = rtc.now();