Объявление

Внимание!
Данный форум предназначен только для радиолюбителей!
Никакие прочие объявления, реклама товаров либо услуг невозможны!


Любой спам на нашем форуме запрещён!
Разрешаются только ссылки по темам! 3а нарушения БАН.


Часы-погодная станция. 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) Просмотров: 3735
admin
Администратор
 
Сообщений: 60
Зарегистрирован: 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) Просмотров: 3728
2017103013154-1-1.jpg
Часы. Благодаря двухцветному экрану отображение получилось красивое.
2017103013154-1-1.jpg (14.69 KiB) Просмотров: 3728
admin
Администратор
 
Сообщений: 60
Зарегистрирован: 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) Скачиваний: 240
admin
Администратор
 
Сообщений: 60
Зарегистрирован: 27 ноя 2016, 18:21


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

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

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

cron
/