Объявление

США начнут предпринимать меры экономического и военного характера, если Россия не прекратит нарушать Договор о ракетах средней и меньшей дальности (ДРСМД)

Решение главы Национального Объединения "Новая Россия - Великая Россия" Rommstaina: http://russianew.ru/viewtopic.php?f=120&t=4039

Часы-погодная станция. UNO, DS18b20, I2C OLED, DHT11, DS1307

Правила форума
Внимание! Любой спам на нашем форуме запрещён!
Коммерческая реклама сайтов, ссылки, спам запрещены. Так же запрещены ссылки на сайты в профилях новичков.
Бан без предупреждений.

Часы-погодная станция. UNO, DS18b20, I2C OLED, DHT11, DS1307

Сообщение admin » 03 янв 2017, 02:07

Наш сегодняшний конструктор состоит из:


Arduino UNO - плата Ардуино.
DS18b20 - температурный датчик.
I2C OLED - OLED дисплей работающий по I2C.
DS1307 - часовой модуль.
DHT11 - датчик влажности и температуры.


Конечно у вас возник вопрос: для чего дво датчика если DHT11 имеет в себе и датчик температуры и датчик влажности. А потому что минусовые температуры он не воспринимает и работает при температурах 0-50%. А это не есть хорошо. Мы будем делать вещь для любых погодных режимов. Думаю она пригодится многим. На борту у нас будут полноценные часы, отображение влажности в процентах, и температуры в градусах цельсия.

В дальнейшем для большей функциональности мы прикрутим ещё и реле, чтобы при заданных параметрах что-нибудь мы могли включать. А так же прикрутим джойстик или энкодер для того чтобы эти параметры выставлять.

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

dht11..........................................http://data-ru.ru/forum/download/file.php?id=16
OLED_I2C.....................................http://data-ru.ru/forum/download/file.php?id=9
DS1307........................................http://data-ru.ru/forum/download/file.php?id=17
OneWire......................................http://data-ru.ru/forum/download/file.php?id=6


Всё это соединяем согласно распиновке в скетче:

Arduino UNO:.....3,3V......5V.....GND.....A0......A1.....A2.....A3.....A4.....A5
OLED: .............X..................X.........................................X......X..
DS1307:......................X........X.........................X.......X................
DS18b20:..........X..................X..................X................................
DHT11:.......................X.......X.........X.........................................



Скетч первоначальный:

Код: выделить все
#include <dht11.h>
dht11 sensor;
#define DHT11PIN A0

#include <OLED_I2C.h>
//SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//SCK (SCL) pin   -> Arduino Analog 5 or the dedicated SCL pin
OLED  myOLED(A4, A5, 8); //пины OLED: SDA на A4, SCK на A5 Arduino

extern uint8_t MegaNumbers[];//Установка шрифтов Больших
extern uint8_t RusFont[];// Установка русских шрифтов
extern uint8_t SmallFont[];// Установка малых шрифтов
extern uint8_t term[];//картинка термометра
extern uint8_t grad[];//картинка градуса
#include <DS1307.h> //подключение библиотеки часового модуля
DS1307 rtc(A3, A2);//часовой модуль подключен к пинам Arduino: Vcc к +5V, GND к 3емле, SDA к A3, SCL к A2
Time t; // присвоение переменной для времени
#include <OneWire.h> //подключение библиотеки однопроводного интерфейса
OneWire ds(A1); // пин сенсора датчика температуры (средняя ножка) DS18b20 к пину A1 Arduino. Не  забываем этот пин сенсора подтянуть к 3,3V сопротивлением!
int x = 0;
void setup() {
myOLED.begin();
rtc.halt(false);
//rtc.setDOW(WEDNESDAY);// коррекция дня недели, не обязательна
//rtc.setTime(00, 22, 0); Для коррекции времени раскомментировать
//rtc.setDate(03, 01, 2017); Для коррекции даты раскомментировать
}
void loop() {
sensor.read(A0); // Пин сенсора DHT11 (средний) на Ардуино A0
if (x >= 10) {
temp();
x=0;
}
else
{
watch();
}
x++;
}
void watch() {
myOLED.setFont(RusFont);
t = rtc.getTime();//переменная времени получает данные с часового модуля
switch (t.dow)
{
case 1:     myOLED.print("GJYTLTKMYBR", CENTER, 0);    break;//дни недели набранные русскими буквами в латинской раскладке клавиатуры
case 2:     myOLED.print("DNJHYBR", CENTER, 0);        break;
case 3:     myOLED.print("CHTLF", CENTER, 0);          break;
case 4:     myOLED.print("XTNDTHU", CENTER, 0);        break;
case 5:     myOLED.print("GZNYBWF", CENTER, 0);        break;
case 6:     myOLED.print("CE<<JNF", CENTER, 0);        break;
case 7:     myOLED.print("DJCRHTCTYMT", CENTER, 0);    break;
}
String stringOne = rtc.getTimeStr();
myOLED.setFont(MegaNumbers);
myOLED.print(stringOne.substring(0, 2), 4, 15);
myOLED.print("/", 51, 12);
myOLED.print(stringOne.substring(3, 5), 75, 15);
myOLED.setFont(RusFont);
switch (t.mon)
{
case 1:
myOLED.print(String(t.date), 30, 57);
myOLED.print("ZYDFHZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 2:
myOLED.print(String(t.date), 26, 57);
myOLED.print("ATDHFKZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 3:
myOLED.print(String(t.date), 30, 57);
myOLED.print("VFHNF", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 4:
myOLED.print(String(t.date), 30, 57);
myOLED.print("FGHTKZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 5:
myOLED.print(String(t.date), 36, 57);
myOLED.print("VFZ", CENTER, 57);
myOLED.print(String(t.year), 82, 57);
break;
case 6:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>YZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 7:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>KZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 8:
myOLED.print(String(t.date), 28, 57);
myOLED.print("FDUECNF", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 9:
myOLED.print(String(t.date), 24, 57);
myOLED.print("CTYNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 94, 57);
break;
case 10:
myOLED.print(String(t.date), 26, 57);
myOLED.print("JRNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 11:
myOLED.print(String(t.date), 28, 57);
myOLED.print("YJZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 12:
myOLED.print(String(t.date), 26, 57);
myOLED.print("LTRF<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
}
myOLED.update();
delay(450);
myOLED.setFont(MegaNumbers);
myOLED.print("-", 51, 15);
myOLED.update();
delay(250);
}
//обработка данных датчиком температуры
void temp() { 
for(int x = 0; x < 10; x++){
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(250);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
int Temp = (data[1] << 8) + data[0];
Temp = Temp >> 4;
//получаем данные с модуля времени и выводим их на экран
String stringOne = rtc.getTimeStr();
myOLED.clrScr();
myOLED.setFont(SmallFont);
myOLED.print(stringOne.substring(0, 5), 98, 0);
myOLED.print(rtc.getDateStr(), 0, 0);
myOLED.setFont(RusFont);
//получаем данные с датчика температуры и выводим их на экран
myOLED.print("NTVGTHFNEHF", CENTER, 35);//128x64
myOLED.drawBitmap(4, 18, term, 19, 40);
myOLED.setFont(SmallFont);
myOLED.print(String(Temp), CENTER, 20);
myOLED.drawBitmap(92, 18, grad, 13, 12);
//получаем данные с датчика влажности и выводим их на экран
myOLED.print(String(sensor.humidity), CENTER, 45);
myOLED.print("%", 95, 45);
myOLED.setFont(RusFont);
myOLED.print("DKF:YJCNM", CENTER, 55);
myOLED.update();
myOLED.clrScr();
}
}


Схема соединений модулей:
Вложения
data-ru.jpg
pogodnaya_stanciya_s_chasami
data-ru.jpg (55.03 KiB) Просмотров: 8921
admin
Администратор
 
Сообщений: 71
Зарегистрирован: 27 ноя 2016, 18:21
ТегиЧасы-погодная станция, Arduino UNO, DS18b20, I2C OLED, DHT11, DS1307

Re: Часы-погодная станция. UNO, DS18b20, I2C OLED, DHT11, DS

Сообщение admin » 03 янв 2017, 22:10

Фото
Вложения
2017103013141-1-1.jpg
В верхней части экрана отображается время и дата, ниже показания датчиков температуры и влажности.
2017103013141-1-1.jpg (20.57 KiB) Просмотров: 8914
2017103013154-1-1.jpg
Часы. Благодаря двухцветному экрану отображение получилось красивое.
2017103013154-1-1.jpg (14.69 KiB) Просмотров: 8914
admin
Администратор
 
Сообщений: 71
Зарегистрирован: 27 ноя 2016, 18:21
ТегиФото

Re: Часы-погодная станция. UNO, DS18b20, I2C OLED, DHT11, DS

Сообщение admin » 04 янв 2017, 13:02

Немного доработанный скетч в котором по 10 секунд отображаются часы, температура, влажность.
В архиве файлы для библиотеки OLED_I2C отображающие графически значки влажности, термометра, процента влажности и градуса. Разархивировать и кинуть файлы с расширением с в библиотеку OLED_I2C вашей Arduino IDE

Код: выделить все
#include <dht11.h>
dht11 sensor;
#define DHT11PIN A0

#include <OLED_I2C.h>
//SDA pin   -> Arduino A4 или иной назначенный SDA pin
//SCL pin   -> Arduino A5 или иной назначенный SCL pin
OLED  myOLED(A4, A5, 8); //пины OLED: SDA на A4, SCK на A5 Arduino

extern uint8_t MegaNumbers[];//Установка шрифтов Больших
extern uint8_t RusFont[];// Установка русских шрифтов
extern uint8_t SmallFont[];// Установка малых шрифтов
extern uint8_t term[];//картинка термометра
extern uint8_t grad[];//картинка градуса
extern uint8_t water[];//картинка флажности
extern uint8_t percentage[];//картинка процента

#include <OneWire.h>//подключение библиотеки однопроводного интерфейса
OneWire ds(A1); // пин сенсора датчика температуры (средняя ножка) DS18b20 к пину A1 Arduino. Не  забываем этот пин сенсора подтянуть к 3,3V сопротивлением!
#include <DS1307.h>//подключение библиотеки часового модуля
DS1307 rtc(A3, A2);//часовой модуль подключен к пинам Arduino: Vcc к +5V, GND к 3емле, SDA к A3, SCL к A2
Time t; // присвоение переменной для времени
int x = 0;
int y = 0; //добавка

void setup() {
myOLED.begin();
rtc.halt(false);
//rtc.setDOW(WEDNESDAY);  // Настройка для недели  настроить при первом
//rtc.setTime(12, 27, 0); // Настройка часов
//rtc.setDate(04, 01, 2017); // Настройка даты
}

void loop() {
sensor.read(A0); // Пин сенсора на Ардуино подключать только на цифровые выходы
if (x >= 10) {  // 10 количество секунд, для переключения на температуру
temp();
delay(4000); //добавка
water_proc(); // добавка
delay(8000); //добавка
x=0;
}
else
{
watch();
}
x++;
}
void watch() {
myOLED.setFont(RusFont);
t = rtc.getTime();
switch (t.dow)
{
case 1:     myOLED.print("GJYTLTKMYBR", CENTER, 0);    break;
case 2:     myOLED.print("DNJHYBR", CENTER, 0);        break;
case 3:     myOLED.print("CHTLF", CENTER, 0);          break;
case 4:     myOLED.print("XTNDTHU", CENTER, 0);        break;
case 5:     myOLED.print("GZNYBWF", CENTER, 0);        break;
case 6:     myOLED.print("CE<<JNF", CENTER, 0);        break;
case 7:     myOLED.print("DJCRHTCTYMT", CENTER, 0);    break;
}
String stringOne = rtc.getTimeStr();
myOLED.setFont(MegaNumbers);
myOLED.print(stringOne.substring(0, 2), 4, 15);
myOLED.print("/", 51, 12);
myOLED.print(stringOne.substring(3, 5), 75, 15);
myOLED.setFont(RusFont);
switch (t.mon)
{
case 1:
myOLED.print(String(t.date), 30, 57);
myOLED.print("ZYDFHZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 2:
myOLED.print(String(t.date), 26, 57);
myOLED.print("ATDHFKZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 3:
myOLED.print(String(t.date), 30, 57);
myOLED.print("VFHNF", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 4:
myOLED.print(String(t.date), 30, 57);
myOLED.print("FGHTKZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 5:
myOLED.print(String(t.date), 36, 57);
myOLED.print("VFZ", CENTER, 57);
myOLED.print(String(t.year), 82, 57);
break;
case 6:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>YZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 7:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>KZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 8:
myOLED.print(String(t.date), 28, 57);
myOLED.print("FDUECNF", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 9:
myOLED.print(String(t.date), 24, 57);
myOLED.print("CTYNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 94, 57);
break;
case 10:
myOLED.print(String(t.date), 26, 57);
myOLED.print("JRNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 11:
myOLED.print(String(t.date), 28, 57);
myOLED.print("YJZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 12:
myOLED.print(String(t.date), 26, 57);
myOLED.print("LTRF<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
}
myOLED.update();
delay(450);
myOLED.setFont(MegaNumbers);
myOLED.print("-", 51, 15);
myOLED.update();
delay(450);
}

void temp() { 
for(int x = 0; x < 10; x++){
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(500);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
int Temp = (data[1] << 8) + data[0];
Temp = Temp >> 4;
String stringOne = rtc.getTimeStr();
myOLED.clrScr();
myOLED.setFont(SmallFont);
myOLED.print(stringOne.substring(0, 5), 98, 0);
myOLED.print(rtc.getDateStr(), 0, 0);
myOLED.setFont(RusFont);
myOLED.print("NTVGTHFNEHF", CENTER, 57); //Температура
myOLED.drawBitmap(4, 18, term, 19, 40);
myOLED.setFont(MegaNumbers);
myOLED.print(String(Temp), CENTER, 15);
myOLED.drawBitmap(92, 18, grad, 13, 12);
myOLED.update();
myOLED.clrScr();

 // Serial.println(sensor.temperature,1);
  }
}
void water_proc() { 
  for(int y = 0; y < 20; y++)
  {
  String stringOne = rtc.getTimeStr();
 
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(stringOne.substring(0, 5), 98, 0);
  myOLED.print(rtc.getDateStr(), 0, 0);
  myOLED.setFont(RusFont);
  myOLED.print("DKF:YJCNM", CENTER, 57); // Влажность
  myOLED.drawBitmap(4, 18, water, 20, 40);
  myOLED.setFont(MegaNumbers);
  myOLED.print(String(sensor.humidity), CENTER, 15);
  myOLED.drawBitmap(90, 18, percentage, 35, 35);
  myOLED.update();
  myOLED.clrScr();
 
//  Serial.println(sensor.humidity,1);

  }
}
Вложения
OLED_watch_temp_water.zip
картинки
(2.45 KiB) Скачиваний: 400
admin
Администратор
 
Сообщений: 71
Зарегистрирован: 27 ноя 2016, 18:21


Вернуться в Делимся опытом. Проблемы и непонятки.

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron
/