После того, как я разобрался с подключением датчиков и натестился с разными комбинациями и режимами работы ардуины, все таки решил довести метеостанцию до более менее практичного вида. Колхоз месяца обеспечен ( хотя без скотча, изоленты, жидкиих гвоздей и холодной сварки до этого звания далеко, но все еще впереди)
Как выяснилось из комментариев к
предыдущему посту, во всех датчиках присутствует стабилизатор 662k, что позволяет питать их от 5 В, что в свою очередь позволяет абсолютно все элементы соеденить в общую шину. С информационной шиной I2C не стал заморачиваться, решил не ставить преобразователь логических уровней, все и без него работает, возможно даже в нормальном режиме) В даташитах указана инфа по чипам, а в Китае клепается своя обвязка и, походу, китайцы сами не знают что продают.
В общем я решил в ежедневном исполнении убрать датчик освещенности и инфракрасное управление, вынесу их в отдельный проект, добавить же решил часы реального времени на той же шине I2C.
Выбор пал на
DS3231
Характеристики:
Точность ±2 ppm в диапазоне температур от 0°C до +40°C
Точность ±3.5 ppm в диапазоне температур от-40°C до +85°C
Вход для подключения автономного источника питания, позволяющего обеспечить непрерывную работу
Рабочий температурный диапазон:
коммерческий: от 0°C до +70°C
индустриальный: -от 40°C до +85°C
Низкое потребление
Часы реального времени, отсчитывающие секунды, минуты, часы, дни недели, дни месяца, месяц и год с коррекцией високосного года вплоть до 2100
Два ежедневных будильника
Выход прямоугольного сигнала с программируемой частотой
Быстродействующие (400 кГц) I2C интерфейс
3.3 В питание
Цифровой температурный датчик с точностью измерения ±3°C
Регистр, содержащий данные о необходимой подстройке
Вход/выход сброса nonRST
Даташит
Это относительно чипа, а вот доп инфа по модулю, который ваяют китайцы:
1. Размер: 38 мм (длина) * 22 мм (ширина) * 14 мм (высота)
2. Вес: 8 г
3. Рабочее напряжение: 3.3-5.5 В
4. Микросхемы памяти: AT24C32 (емкость 32 К)
5. Шина IIC интерфейса, (рабочее напряжение 5 В)
6. I2C адрес может быть изменен замыканием A0/A1/A2, по умолчанию адрес 0x57
По идее для точности нужно на питание добавить конденсатор, но я решил действовать без лишних телодвижений, вроде и так работает. За 2 недели время не ушло совсем либо меньше чем на секунду.
Насчет самого модуля, он пришел уже с батарейкой и с уже припаянными контактами, так что покупать какой либо другой модуль не имеет абсолютно никакого смысла. Я поспешил и купил 2 других модуля, более дешевых, но без батарейки и с неприпаянными контактами, так мало того, что если докупить батарейку то получается дороже и точность у них меньше, так еще и лично для меня припаять контакты оказалось адской пыткой.
Вот так выглядит моя схема соединений.
Таки решил освоить эту программу, кое как понарисовывал модули, как соберусь допилить — выложу файл.
Скетч
#include <Wire.h>
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Streaming.h> //http://arduiniana.org/libraries/streaming/
#include <Time.h> //http://playground.arduino.cc/Code/Time
#include <SI7021.h>
SI7021 sensor;
#include "LiquidCrystal_I2C.h"
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 16, 2);
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
void Si7021()
{
si7021_env data = sensor.getHumidityAndTemperature();
double temp1=(double)data.celsiusHundredths/100.0;
double hum1=(double)data.humidityBasisPoints/100.0;
lcd.setCursor(9,0);
lcd << temp1;
lcd.print(L"°C");
lcd.setCursor(9,1);
lcd << hum1 << " \%";
}
void BMP085()
{
double pr=(double)bmp.readPressure() / 133.3224;
lcd.setCursor(0,1);
lcd.print(pr,1);
lcd.print(L" мм");
}
static time_t tLast;
time_t t;
tmElements_t tm;
void RTC_set()
{
//check for input to set the RTC, minimum length is 12, i.e. d,m,yy,h,m,s
if (Serial.available() >= 12) {
//note that the tmElements_t Year member is an offset from 1970,
//but the RTC wants the last two digits of the calendar year.
//use the convenience macros from Time.h to do the conversions.
tm.Day = Serial.parseInt();
tm.Month = Serial.parseInt();
int y = Serial.parseInt();
if (y >= 100 && y < 1000)
Serial << F("Error: Year must be two digits or four digits!") << endl;
else {
if (y >= 1000)
tm.Year = CalendarYrToTm(y);
else //(y < 100)
tm.Year = y2kYearToTm(y);
tm.Hour = Serial.parseInt();
tm.Minute = Serial.parseInt();
tm.Second = Serial.parseInt()+1; /поправка на длительность синхронизации
t = makeTime(tm);
RTC.set(t); //use the time_t value to ensure correct weekday is set
setTime(t);
Serial << F("RTC set") << endl;
//dump any extraneous input
while (Serial.available() > 0) Serial.read();
}
}
}
void Time_print()
{
t = now();
lcd.setCursor(0,0);
lcd << ((hour(t)<10)?"0":"") << _DEC(hour(t)) << ":";
lcd << ((minute(t)<10)?"0":"") << _DEC(minute(t)) << ":";
lcd << ((second(t)<10)?"0":"") << _DEC(second(t));
}
void setup()
{
Serial.begin(9600);
setSyncProvider(RTC.get);
Serial << F("RTC Sync");
if (timeStatus() != timeSet) Serial << F(" FAIL!");
Serial << endl;
bmp.begin();
lcd.begin();
lcd.backlight();
Si7021();
BMP085();
}
int n;
void loop()
{
Time_print();
RTC_set();
if (n==5) {
Si7021();
BMP085();
n=1;
} else {n++;}
delay(1000);
}
Код это немного изменный пример из библиотеки часов. Особенность примера на мой взгляд в том, что происходит (в теории, не знаю как проверить) синхронизация часов ардуины с модулем RTC (setSyncProvider(RTC.get);), и уже на дисплей выводится время ардуины и модуль не дергается каждую секунду, наверно так экономичнее. Изменения коснулись добавления модулей, а также синхронизация ожидается в любой момент времени и с изменным для удобности форматом d,m,yy,h,m,s. Каждую секунду на экране обновляется время и каждых 5 секунд обновляются показания датчиков. После убирания lcd.clear() экран перестал мерзко мигать и, если данные по экрану не скачут (а в данном случае так и есть), они просто красиво обновляются.
Решил никакой истории давления не вести, лично мне достаточно того, что сейчас и того что было вчера.
Батник для синхронизации часов
@echo off
MODE COM1: baud=9600 parity=N data=8 stop=1 dtr=off>nul
ping -n 3 127.0.0.1 > nul
set str=%date%,%Time%,
set str=%str: =%
echo %str%>\\.\COM1
Я по роду свой деятельности регулярно использую батники для автоматизации процессов и тут я решил применить свои навыки. В интернете годных примеров найти не удалось, решил писать сам с нуля. Несколько часов я проходился по одним и тем же граблям, уже и на VBS перешел, уже и скрипт начал писать с эмуляцией нажатий клавиш в терминале, пока до меня не дошло что ардуино перегружается каждый раз как открыватеся терминал, вот что значит не читать мануалы и начинать со всего готового. В общем нужно просто порт открыть с отключенным сигналом DTR, подождать пару секунд, получить системное время, удалить пробелы(если получать дату и время отдельно, удалять пробелы ненужно) и отослать это в порт.
Кстати потребляет метеостанция после переделки 0,04 А, в сутки потребляет 960 мАч. Я ее без расчетов запитал от повербанка около 2 Ач и через двое суток все благополучно потухло) Сейчас запитано от БП от LG MCS-04ED (5,26 В/1,8A), все работает чинно.
Коробка обычная, картонная, предположительно временная, от модема Sparklet, внутри есть перегородка, которая подпирает с середины экран. Хотя, возможно, если обклеить чем то, то будет прилично, а пока колхоз колхозный.
Парочка уточнений: как сказали в комментариях, датчик давления лучше спрятать от света, что написано в даташите, поэтому я его засунул в корпус, всеравно я с него температуру не беру. Кстати в часах тоже есть датчик температуры, но с точностью 3 градуса, используется для коррекции хода. Также важное замечание, в коде скетча, там, где присваивается значение секунд, добавляется секунда, как поправка на длительность синхронизации, логичнее конечно делать поправку в батнике, но легче было просто добавить в коде секунду)
В общем, судя по комментариям и этой
статье в этом модуле возможны некоторые доработки:
1) можно убрать светодиод индикации питания
2) можно убрать подтягивающие резисторы шины I2c
3) можно и даже нужно выпаять что то из цепи подзарядки батареи, которая в принципе не должна заряжаться, а даже если поставить аккумулятор, то не будет никакого контроля заряда, да и у аккумулятора намного меньше емкость и больше стоимость
Вот из даташита:
«During operation the sensor is sensitive to light, which can influence the accuracy of the
measurement (photo-current of silicon).»
Отличная микросхема, за два года работы «ушла» секунд на 5.
Если у вас хороший источник питания, то никаких конденсаторов не надо. На точность хода не влияет. Главное чтобы напряжение питания было согласно datasheet.
У Ардуино нет встроенных часов. Иначе зачем вам модуль RTC?
Кстати микросхема очень точная, не вижу смысла её постоянно синхронизировать :) Ну и всегда целостность и вид устройства определялся корпусом, найдите время сделать хороший корпус.
в ардуино есть кварц, с его помощью отсчитываются задержки. с помощью библиотеки эмулируется ход часов, так называемые software clock, но они не точные.
изначально меня не устроил сам метод установки времени по времени прошивки да и хотелось подкорректировать в любое время если есть возможность.
вот только сдается мне, что использование потоков сильно сжирает ресурсы как пзу, так и озу
у меня 17к только мелодия звонка занимает в виде набора данных
а сколько у тебя прошивка заняла?
This syntax is familiar to many, is easy to read and learn, and, importantly, consumes no resources. (Because the operator functions are essentially just inline aliases for their print() counterparts, no sketch gets larger or consumes more RAM as a result of their inclusion.)
это радует
Правильно ли я понял, что все модули подключали по i2c шине?
У меня есть все модули из перечисленных, кроме модуля, подключенного к дисплею.Это i2c модуль для экрана?
А зачем на этом модуле EEPROM-ка 24C32?
Будильники хранить?
Видимо перепутал с другим датчиком. Там чётко было указано, удалить при использовании.
edwardmallon.wordpress.com/2014/05/21/using-a-cheap-3-ds3231-rtc-at24c32-eeprom-from-ebay/
А вообще самое дешевое это взять этот модуль за 40р да микроконтроллер(да хотя бы ардуино микро или нано, не обязательно голый) за 200р и на этом уже собрать синхронизатор для ваших часов. Или даже всю плату управления часами.
или вам нужно оживить что то советскопромышленное типа Электроника 7? (у самого на работе такие люминифором помирают). Тогда совет sereginsk-а вполне разумен.
А если взять всместо ардуины esp826 (обозревалась не раз), то помимо RTC можно еще и синхро с ntp сделать (я в свои часы так и не поставил rtc — третий месяц работают по ntp.
2LogicKiller — там в библиотеке Time есть команда, которая по описанию «выполняет синхронизацию автоматически через заданое время». Т.е. у вас ардуина получила время из РТЦ и пошла считать время своим кварцем. Который, мало того что китайский, так еще и не кратный 32768 (или сколько там у часов кварц?). А если дать эту команду, то раз в указанное количество милискеунд «внутрение» часы ардуины будут подгоняться под Rtc. (ну по крайней мере я так понял из описания):
geektimes.ru/post/264110/
Использовал самый дешёвый GPS модуль с антенной. (5$ = 378р.)
aliexpress.com/item/NEO6M-V2-new-GPS-module-with-Flight-Control-Flight-Control-EEPROM-MWC-APM2-5-large-antenna/32564560960.html
С него и снимаю показания времени. Получаются самые точные, автономные часы.
Собираю сейчас один проект, долгоиграющий. Через пару месяцев запилю обзор.
iarduino.ru/shop/Expansion-payments/i2c-hub-trema-modul.html
по такому запросу на али выдает какуюто микросхему, явно не то, неужто только самому делать.
Уважаемое сообщество, на ваш суд предлагаю прототип своей метеостанции на Arduino.
Процессор: Atmega328.
Переходная плата с 5 вольт на 3 вольта.
Индикация:
— Время. (DS3231)
— День недели/месяц/число/год. (DS3231)
— Температура в помещении. (BMP180)
— Температура на улице. (DS18B20)
— Давление. (BMP180)
— Влажность в помещении. (Si7021)
С левой стороны на графиках отображение максимальной и минимальной температуры за сутки. Графики меняют свой масштаб в зависимости от показаний.
что еще будет.
— Индикация фаз луны.(это очень важно при общении с женским полом, хотя этого мало, надо еще знать положение Марса относительно Сатурна. :) )
— FM радио на базе модуля (RDA5807M).
— Будильник, будет включать радио.
— Можно еще голосовой модуль поставить (WTV020) будет кукукать и время сообщать. Ра работе сообщать об обеде и начале перекура.
Все датчики и FM радио работают по шине i2c. Только 18b20 по 1-Wire.
Дисплей управляется по spi.
Все это чудо стоит на подоконнике возле газ плиты. Поэтому влажность так скачет. А по верхнему графику видно когда открывали окно для проветрывания.
Опрос датчиков идет каждые 15 секунд.
График обновляется раз в 15 минут. За 1 час 4 раза. Каждая вертикальная полоска соответствует одному часу. Вот и видно динамику изменения показаний за сутки.
Значение графиков заносятся в eeprom атмеги, тоже каждые 15 минут.
При количестве циклов чтения/записи в 100,000. Должно хватить на 2,8 года. ну посмотрим. Можно и раз в час писать.
Заказал коробочки, жду. Вот когда все соберется в кучу, ждите обзора. Проект будет открытый для всех.
Может и энтузиастов найду. Вместе будет веселее. Можно же добавить шкурки для оформления. Выводить разные экраны(графики, только большие значения датчиков, только FM радио с RDS информацией.)
Стоимость всех комплектующих около 20$-25$.
P.S.
Вот такой пока я вижу метеостанцию. А дальше можно и скорость ветра мерить и wifi прицепить и датчики беспроводные.
я смотрю вы удалили наклейку с датчика влажности, вроде как ненужно было так делать, а с модуля часов чтото выпаивали?
почему температура с BMP180, а не Si7021?
У Atmega328Р вроде 1к память и вряд ли вы используете её всю.
На сколько понимаю, 100.000 циклов чтения/записи всё же указано на одну ячейку памяти.
Может внести ещё переменные, чтоб они всё время смещали адреса записанных данных. Так будет использоваться весь объём памяти. И следовательно ресурс её возрастёт многократно.
И можете в личку кинуть скетч?
Я только начал разбираться с данными контроллерами. Собираю один проект но знаний катастрофически не хватает. Поэтому беру куски кодов с разных скетчей и собираю свой. И вот как раз работа с постоянной памятью меня сейчас и интересует.
оптимизировать, очень мало остается флэш и ОЗУ.
С EEPROM работаю так:
Ну и с датчика Si7021 вы зря защитную наклейку оторвали. Пыль попадёт и точность показаний уменьшится.
P.S. Упс, уже всё это сказали, ну — повторение, мать учения…
aliexpress.com/item/DS3231-AT24C32-IIC-Module-Precision-Real-Time-Clock-Memory-Module-For-Arduino/1984693922.html
aliexpress.com/item/Freeshipping-1pcs-lot-Welded-Nano-3-0-controller-compatible-for-arduino-nano-CH340-USB-driver-NO/32524137828.html
А то скачал, но мне выдаёт кучу ошибок такого типа: