Данная погодная станция обеспечивает постоянное получение сведений о состоянии погодных условий. Проект основан на плате микроконтроллеров Arduino, а данные выводятся на LCD экран. Ранее был проект вывода данных с датчиков на веб-страницу с помощью W5100. Небольшой размер "железа" позволяет поместить устройство в маленьком пластиковом коробе, части которого изготовлены при помощи лазерной резки.
Датчик уровня воды и снега.
Индикатор уровня воды используется для вывода уровня воды в баке во избежании его переполнения.
DHT11 представляет собой комбинированный цифровой датчик температуры и влажности. Датчик обладает отличным качеством, высокой скоростью работы, противоинтерференционной способностью и самое главное - низкой стоимостью.
Фоторезисторы, также известные как светозависимые резисторы (LDR), являются светочувствительными устройствами, наиболее часто используемыми для определения наличия или отсутствия света, или для измерения интенсивности света. В темноте их сопротивление очень велико, но когда датчик LDR подвергается воздействию света, сопротивление резко падает, вплоть до нескольких Ом.
LCD1602 с шиной I2C. Синий потенциометр на ЖК-дисплее I2C 1602 используется только для подсветки.
I2C использует только две линии, Serial DataLine (SDA) и Serial Clock Line (SCL), которые подключаются к резисторам. Типичные напряжения - +5 В или +3,3 В, хотя допускаются системы с другими напряжениями.
DS1302 - часики реального времени.
Часы основаны на интегрированной микросхеме DS1302, внутри которой есть часы / календарь в реальном времени и 31 байт статической ОЗУ. Формат времени можно увидеть как hh/mm/ss, а формат даты - yyyy/mm/dd. Так же можно высчитать день недели.
LM35 - датчик температуры.
LM35 это прецизионный интегральный датчик температуры с широким диапазоном температур, высокой точностью измерения, калиброванным выходом по напряжению. Именно эти качества определяют популярность датчика.
Инфракрасный приемник и пульт дистанционного управления
Эти два компонента работают вместе: ИК-приемник позволяет получать данные с пульта дистанционного управления. Уже рассказывал как собрать контроллер вытяжки с управлением от пульта телевизора. Данные зависят от того, какую кнопку вы хотите нажать. Были выбраны следующие кнопки для назначения их определенным функциям:
Клавиша 0 - позволяет увидеть время и дату
Клавиша 1 - позволяет увидеть данные с датчиков DHT11 и LM35
Клавиша 2 - позволяет увидеть в процентах уровень освещенности
Клавиша 3 - позволяет увидеть в миллиметрах уровень жидкости
Клавиша "Повтор" - прокручивает все окна с интервалом в 4 секунды
Сборка корпуса.
Рассмотрев размер устройства, мы продолжили строительство корпуса из плексигласа. Размеры сторон с их взаимными блокирующими сиденьями и отверстиями для выхода проводов датчиков были рассчитаны с помощью программного обеспечения Autocad, после чего мы занялись вырезанием, используя машину для лазерной резки. И, наконец, мы собрали все с помощью мощного клея.
Файл исходник - Скачать.
Схема устройства была сделана в программной среде fritzing (скачать здесь).
Разрабатывали код в среде Arduino IDE, использовали все необходимые библиотеки. И вот что у нас получилось:
Это главный экран, который пользователь может видеть, когда мы включаем плату. При включении появляется надпись «Arduino Weather Station». Вы также можете увидеть эту надпись после каждого обращения к AWS.
Экран даты и времени, к которому пользователь может получить доступ, просто нажав кнопку 0 на пульте дистанционного управления. При нажатии экран имеет задержку в 10 секунд, а затем возвращается на главный экран.
Экран, который показывает данные, полученные датчиками DHT11 и LM35 относительно влажности и температуры соответственно. Он "привязан" к кнопке 1 на пульте дистанционного управления, и когда она нажимается, экран имеет задержку в 10 секунд, а затем возвращается на главный экран.
Экран уровень освещенности. Привязан к кнопке 2 на пульте ДУ.
Этот экран показывает уровень жидкости в баке. Он подключен к кнопке 3 на пульте дистанционного управления.
Сама программа станции
Код
#include <IRremote.h>
#include <stdio.h> //clock library
#include <string.h> //clock library
#include <DS1302.h> //clock library
#include <dht.h> //dht11 library
#include <LiquidCrystal_I2C.h> //LCD library
#include <Wire.h> //Wire for LCD library
#define lmPin A1
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;
const int DHT11_PIN = 4;
const int waterSensor = 0;
int waterValue = 0;
int mmwaterValue = 0;
int sensorPin = A3;
int luce = 0;
int pluce = 0;
float tem = 0;
long lmVal = 0;
const int irReceiverPin = 3;
IRrecv irrecv(irReceiverPin);
decode_results results;
uint8_t RST_PIN = 5;
uint8_t SDA_PIN = 6;
uint8_t SCL_PIN = 7;
char buf[50];
char day[10];
DS1302 rtc(RST_PIN, SDA_PIN, SCL_PIN);
void print_time()
{
Time t = rtc.time();
memset(day, 0, sizeof(day));
switch (t.day)
{
case 1:
strcpy(day, "Sun");
break;
case 2:
strcpy(day, "Mon");
break;
case 3:
strcpy(day, "Tue");
break;
case 4:
strcpy(day, "Wed");
break;
case 5:
strcpy(day, "Thu");
break;
case 6:
strcpy(day, "Fri");
break;
case 7:
strcpy(day, "Sat");
break;
}
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
Serial.println(buf);
lcd.setCursor(2, 0);
lcd.print(t.yr);
lcd.print("-");
lcd.print(t.mon / 10);
lcd.print(t.mon % 10);
lcd.print("-");
lcd.print(t.date / 10);
lcd.print(t.date % 10);
lcd.print(" ");
lcd.print(day);
lcd.setCursor(4, 1);
lcd.print(t.hr);
lcd.print(":");
lcd.print(t.min / 10);
lcd.print(t.min % 10);
lcd.print(":");
lcd.print(t.sec / 10);
lcd.print(t.sec % 10);
}
void setup() {
Serial.begin(9600);
rtc.write_protect(false);
rtc.halt(false);
irrecv.enableIRIn();
lcd.init();
lcd.backlight();
pinMode(sensorPin, INPUT);
Time t(2017, 12, 03, 10, 15, 00, 1);
rtc.time(t);
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("A");
delay(50);
lcd.setCursor(1, 0);
lcd.print("r");
delay(50);
lcd.setCursor(2, 0);
lcd.print("d");
delay(50);
lcd.setCursor(3, 0);
lcd.print("u");
delay(50);
lcd.setCursor(4, 0);
lcd.print("i");
delay(50);
lcd.setCursor(5, 0);
lcd.print("n");
delay(50);
lcd.setCursor(6, 0);
lcd.print("o");
delay(50);
lcd.setCursor(8, 0);
lcd.print("W");
delay(50);
lcd.setCursor(9, 0);
lcd.print("e");
delay(50);
lcd.setCursor(10, 0);
lcd.print("a");
delay(50);
lcd.setCursor(11, 0);
lcd.print("t");
delay(50);
lcd.setCursor(12, 0);
lcd.print("h");
delay(50);
lcd.setCursor(13, 0);
lcd.print("e");
delay(50);
lcd.setCursor(14, 0);
lcd.print("r");
delay(50);
lcd.setCursor(4, 1);
lcd.print("S");
delay(50);
lcd.setCursor(5, 1);
lcd.print("t");
delay(50);
lcd.setCursor(6, 1);
lcd.print("a");
delay(50);
lcd.setCursor(7, 1);
lcd.print("t");
delay(50);
lcd.setCursor(8, 1);
lcd.print("i");
delay(50);
lcd.setCursor(9, 1);
lcd.print("o");
delay(50);
lcd.setCursor(10, 1);
lcd.print("n");
delay(50);
if (irrecv.decode(&results))
{
if (results.value == 0xFF6897)
{
lcd.clear();
print_time();
delay(10000);
lcd.clear();
delay (200);
irrecv.resume();
}
if (results.value == 0xFF30CF)
{
lcd.clear();
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0, 0);
lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem);
lcd.print(char(223));
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Hum:");
lcd.print(DHT.humidity, 1);
lcd.print(" % ");
delay(10000);
lcd.clear();
delay(200);
irrecv.resume();
}
if (results.value == 0xFF18E7)
{
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6, 1);
lcd.print(pluce);
lcd.print("%");
delay(10000);
lcd.clear();
delay(200);
irrecv.resume();
}
if (results.value == 0xFF7A85)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Fluid level(mm):");
int waterValue = analogRead(waterSensor);
lcd.setCursor(6, 1);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.print(mmwaterValue);
delay(10000);
lcd.clear();
delay(200);
irrecv.resume();
}
if (results.value == 0xFF9867)
{
lcd.clear();
print_time();
delay(4000);
lcd.clear();
delay (200);
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0, 0);
lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem);
lcd.print(char(223));
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Hum:");
lcd.print(DHT.humidity, 1);
lcd.print(" % ");
delay(4000);
lcd.clear();
delay(200);
lcd.setCursor(4, 0);
lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6, 1);
lcd.print(pluce);
lcd.print("%");
delay(4000);
lcd.clear();
delay(200);
lcd.setCursor(0, 0);
lcd.print("Fluid level(mm):");
int waterValue = analogRead(waterSensor);
lcd.setCursor(6, 1);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.print(mmwaterValue);
delay(4000);
lcd.clear();
delay(200);
irrecv.resume();
}
}
}
Проект очень прост для повторения, думаем, сборка не должна вызвать сложностей.
.
.
Просмотров: 7983. Оценка статьи:
из 5. Уже оценило