Monthly Archives: September 2017


Project weather station 1

IMG_2466-2

Описаното тук устройство е от тип „домашна метео-станция“.

Използваният хардуер на устройството е следният:
Waveshare 4.3 e-ink екран
Arduino Uno
Adafruit BME280 комбиниран сензор за температура, налягане и влажност на въздуха
DS3231 базиран хардуерен часовник

Функционалност

  • час
  • дата
  • температура
  • налягане
  • относително налягане
  • влажност
  • краткосрочна прогноза
  • тенденция на налягането

Основните предизвикателства при разработката бяха:

  • използване на шрифт, различен от вградения във firmware-а на дисплея
  • създаване на изображения при ограниченията на паметта на използвания микроконтролер
  • избора и имплементацията на алгоритъм за прогноза

Шрифт
Дисплеят разполага с вграден набор от шрифтове, които са растерни, съдържат само латински и китайски символи и са с три размера. За съжаление шрифтовете са различни за различните размери, което представлява проблем за създаването на удобен и естетически издържан интерфейс на устройството. Решението беше да се дефинира статично в кода (като тримерен масив) шрифт със символите за цифри, всеки от които се състои от 5×7 пиксела. Първоначално беше използван един байт за всеки писел, но поради ограничената RAM памет на микроконтролера това заемаше почти цялата налична памет. Решението на това беше да се използва един байт за всеки стълб от изображението на символа, което води до загуба само от един бит на всеки 7.
Библиотеката с API функциите на дисплея съдържа примитиви за чертане на запълнена окръжност, която използвах за изобразяване на символите. Създадената от мен функция получава като параметър размера на шрифта, което определя диаметъра на окръжността и разстоянието между отделните окръжности и в резултат получих шрифт с променлив размер, неограничен от фиксираните три размера на вградените в устройството шрифтове.

Изображения – икони за прогноза
Дисплеят поддържа качването на изображения във вградената памет, но те са растерни и не подлежат на мащабиране. Поради това реших да създам програмни функции за изчертаване на икони, базирани на наличните графични примитиви, които както и при шрифтовете да дадат възможност за промяна на размера. Изображенията, на които се спрях са за слънце, облак и дъжд, които могат да се комбинират по различни начини. Бяха използвани примитивите за запълнена окръжност и правоъгълник, за да се създадат стилизирани контурни изображения. За съжаление обаче API на дисплея не предоставя функция за линия, на която да се определя дебелината. Това наложи имплементацията на базовия алгоритъм на Bresenham, като вместо пиксели се чертаят окръжности, което определя дебелината на линията.

Алгоритъм за прогноза
Извършеното от мен проучване показа, че производителите на съществуващите устройства от този тип не публикуват никаква информация за използвания от тях алгоритъм за определяне на краткосрочната прогноза на времето. В публично достъпната част на Интернет единственият описан алгоритъм за тази цел е т. нар. Zambretti алгоритъм, кръстен на двамата си създатели Negretti и Zambra и създаден през далечната 1915-а година. Входните данни са сезон, относително налягане, тенденция на налягането (покачване, падане или стабилно), земно полукълбо и посока на вятъра. Алгоритъмът е емпиричен и създаден за северното полукълбо и по-точно Великобритания. Извършени анализи показват, че посоката на вятъра има ограничен ефект върху крайния резултат, което улеснява прилагането му. Температурата, влажността и абсолютното налягане се връщат от използвания сензор, но относителното налягане трябва да бъде изчислено. Съществуват различни формули за това, като използваната от мен е следната:

Screenshot from 2017-09-14 17:33:12

където
P0 е налягането на морското равнище
P е измереното налягане в хектопаскали
h е надморската височина в метри
T е температурата в градуси по Целзий.

Проблем представлява определянето на надморската височина. Използваният от мен сензор връща приблизителната височина, но тъй като е базиран на барометричното измерване се влияе от него. Експериментите установиха, че при промяна на налягането, което всъщност е най-важния индикатор за промяна на времето се променя и изчислената надморска височина, което води до „закотвяне“ на изчисленото относителното налягане и в резултат на това до неточни прогнози. За решаването на този проблем може да се подходи по два начина – да се събират данни за налягането за продължителен период от време и да се вземе осреднена стойност или да се въвежда ръчно от потребителя. И двата подхода имат своите ограничения – първият изисква продължително събиране на данни и памет за съхранението им, а вторият изисква от потребителя да знае точната надморска височина. Това обаче е цената за получаване на адекватна краткосрочна прогноза.
Предизвикателство се оказа и определянето на тенденцията, защото всички материали по темата просто казват, че възможните стойности са „покачване“, „понижение“ и „стабилно/без промяна“, но не дефинират тези понятия. В публикации, несвързани с конкретния алгоритъм тези понятия са дефинирани като промяната на налягането в хектопаскали с една или повече единици за между един и три часа. Поради това се спрях на следната реализация: съхранявам стойностите на относителното налягане на всеки 10 минути в масив от 10 елемента. Когато масивът се запълни тенденцията се изчислява като разликата между средните на първите три и на последните три стойности. Масивът се използва като опашка, като единадесетата постъпила стойност отива на десето място, а първата се премахва и т. н.

Алгоритъмът на Zambretti на базата на входните параметри връща число, което се сверява с таблица от текстови описания на прогнозата. Някои от компютърните реализации на алгоритъма се стремят да изведат формула между числото и съответните стойности, но поради ограничената поддръжка на реални стойности в микроконтролера използвах подхода, избран от разработчиците на популярната Javascript имплементация на алгоритъма и използвам числови интервали, определени от условни оператори в кода.

Таблица със съответствията между текстовите описания на алгоритъма на Zambretti и използваните изображения

Понижение на налягането
Settled fine
Слънце
Fine weather
Слънце
Fine becoming less settled
Слънце, облак
Fairly fine showery later
Слънце, облак
Showery becoming more unserttled
Облак
Unsettled, rain later
Слънце, облак, дъжд
Rain at times, worse later
Слънце, облак, дъжд
Rain at times, becoming very unsettled
Облак, дъжд
Very unsettled, rain
Облак, дъжд

Стабилно налягане
Settled fine
Слънце
Fine weather
Слънце
Fine possibly showers
Слънце, облак
Fairly fine showery later
Слънце, облак
Showery bright intervals
Слънце, облак, дъжд
Changeable, some rain
Слънце, облак, дъжд
Unsettled, rain at times
Облак, дъжд
Very unsettled, rain
Облак, дъжд
Very unsettled, rain
Облак, дъжд
Stormy, much rain
Облак, дъжд

Покачване на налягането
Settled fine
Слънце
Fine weather
Слънце
Becoming fine
Слънце, облак
fairly fine, improving
Слънце, облак
fairly fine, possibly showers
Облак
showery early, improving
Облак, дъжд
Changeable mending
Облак
rather unsettled Clearing later
Облак
unsettled, probably improving
Облак
unsettled, short fine intervals
Облак
Very unsettled, finer at times
Облак, дъжд
Stormy, possibly improving
Облак, дъжд
Stormy, much rain
Облак, дъжд

Бъдещо развитие
определяне на фазата на Луната
показване на деня от седмицата
добавяне на бутони за настройка
добавяне на енерго-независима памет за съхранение на събраните данни
външен сензор за температура и влажност
добавяне на изображение за буря
свързване през WiFi към мобилни устройства за настройка и управление
показване на събития – рождени и именни дни, официални празници и лични ангажименти, дефинирани от мобилно приложение

Download:

Можете да го изтеглите оттук:

https://github.com/fandonov/weatherstation

Връзки
https://www.apple.com/shop/accessories/all-accessories/homekit?page=1
http://keisan.casio.com/exec/system/1224575267#!