portaldacalheta.pt
  • Основен
  • Начин На Живот
  • Уеб Интерфейс
  • Ux Дизайн
  • Процес На Проектиране
Технология

Как направих напълно функционална метеорологична станция Arduino



АКТУАЛИЗАЦИЯ: Работата по нашата метеорологична станция Arduino продължи след публикуването на тази статия, която завърши с пускането на Отворете метеорологична станция (OWS) . Проверете за допълнителни актуализации, ресурси, заедно с код и нови уроци.

За какво става въпрос?

Кайт сърф е един от най-пристрастяващите спортове в света. Всичко, от което се нуждае, е кайтборд, водоем и няколко аксесоари. Това е чудесен начин да влезете в контакт с природата, да освободите ума си и да упражнявате. Освен това можете наистина полудявам с него.



Та какъв е проблема?

О, забравих едно съществено изискване: вятър. И тук имаме нашия проблем: никога не знаете дали ще има вятър или не, освен ако не живеете точно до любимото си място за кайтсърфинг.



живея в Кордоба Аржентина , на около 130 километра (~ 80 мили) от езерото, където кайтсърф. Това е приблизително два часа път с което мога да се справя. Но не мога да се справя с факта, че прогнозите за времето са неточни. А там, където живея, добрите условия на вятъра продължават само няколко часа. Последното нещо, което искате да направите, е да изчистите графика си в понеделник, за да отидете на кайтсърф и да се озовете да псувате боговете на безветрено езеро след два часа шофиране.

как да направим кода по-ефективен

Трябваше да знам вятърните условия на любимото ми място за кайтсърфинг - в реално време. Затова реших да построя собствена метеорологична станция.

Измерване на времето в реално време - във враждебна среда

Целта беше да се предоставят данни за времето в реално време на браузъра у дома:

Цялостен процес за метеорологична станция arduino

Преди да вляза в подробностите, нека отделим малко време, за да разгледаме ключовите въпроси и предупреждения, включени в проект като този:

  • Как мога да създам метеорологична станция, която да не е нито ценна, нито привлекателна за крадеца?
  • Как мога да огранича хардуерните разходи и времето за разработка до минимум?
  • Как мога да измервам и осъществявам достъп до данни за времето в реално време и да ги показвам по полезен начин?
    • Необходими измервания: вятър и пориви на вятъра, посока на вятъра, дъжд, атмосферно налягане, температура, влажност
    • Свържете станцията към Интернет
    • Съхранявайте и извличайте местни метеорологични данни
    • Комуникирайте между метеорологична станция и сървър
  • Как мога да намаля поддръжката до (почти) нула?
    • Управлявайте окачването на софтуера
    • Управление на загубата на свързаност
    • Управлявайте загубите на енергия

Поздравете моя малък приятел! 

файл

Може би си мислите, че ръкавицата е там, за да направи станцията да изглежда по-приятелска; но всъщност се използва за тестване на барометричния сензор (налягането на ръкавицата се увеличава в надутата ръкавица). Вдясно можете да видите станцията в крайното й местоположение, кацнала на върха на близката кула.

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

файл

Това е страхотно! Е, как го направихте?

Е, ще обърна внимание на всяка точка на свой ред:

„Как мога да създам метеорологична станция, която да не е нито ценна, нито привлекателна за крадеца?“

Това беше критичен фактор и в много отношения движеше останалата част от процеса на проектиране. Повечето готови станции под линията от $ 2000 изискват a USB връзка с компютър . Ако крадецът разпознае, че станцията има компютър до себе си, това ще бъде краят на нещата, тъй като разходите за подмяна на компютъра и станцията ще бъдат над личния ми бюджет. Затова реших да тествам няколко хардуерни платформи за внедряване на станцията от нулата, на по-ниска цена.

„Как мога да сведа разходите за хардуер и времето за разработка до минимум?“

Само аз поддържах разходите за този страничен проект и върших цялата работа в свободното си време, така че, разбира се, това беше голяма грижа. Започнах с популярното PIC32 и някои предварително сглобени микрочип Ethernet модули, но разходите не бяха толкова ниски, колкото очаквах и имаше твърде много режийни разходи, свързани с хардуерния монтаж и разширение. След това започнах да разглеждам Arduino : хардуер и софтуер с отворен код за прототипиране на електроника, използващи език C. Точно това исках и можех да закупя модули DealeXtreme . Успях да започна да играя само с $ 15 разходи и два дни от времето си.

Разбира се, Arduino също има своите ограничения: само 2KBite RAM и 32Kbytes за моя компилиран софтуер - това не оставя много място за изискани низове или безполезни променливиедин.

„Как мога да измервам и осъществявам достъп до метеорологичните данни в реално време и да ги показвам по полезен начин?“

В момента станцията ми може да измерва: скорост на вятъра, пориви на вятъра, посока на вятъра, температура, влажност, дъжд и атмосферно налягане. Температурата, влажността и налягането се управляват от няколко библиотеки, което значително улесни живота.

Измерването на скоростта на вятъра и дъжда беше малко разхвърляно. Сензорите, задействани чрез отваряне и затваряне на превключвател ( тръстиков превключвател ). По този начин трябваше да приложа хардуерни прекъсвания, за да уловя сензора веднага щом задейства въвеждането. Тоест, трябваше да извикам някакъв метод:

attachInterrupt(RAINGAUGE_PIN, countRainCycles, FALLING);

Това прекъсване би нарушило нормалното изпълнение на кода и ще извика функцията countAnemometerCycles или countRainCycles веднага щом превключвателят изпадне в падащ ръб, произведен чрез затваряне или отваряне на веригата. Няколко променливи се увеличават на всеки спусък на превключвателя. (По-късно претегляте тези променливи, за да отчетете единични реализации.)

void countRainCycles() { rainCyclesCounter++; // This is easy! And it actually works. }

Но не толкова бързо! Този процес генерира стотици фалшиви задействания в резултат на отскачащия ефект на превключвателя, присъщ на всеки хардуерен превключвател. За щастие има както хардуерни, така и софтуерни решения за този проблем.

Относно подскачащия ефект

Подскачащият ефект възниква като последица от превключвателя, който физически отваря или затваря своите „контакти“, които установяват контакт с останалата част от веригата. Когато контактите започнат да се разделят (отваряне на превключвателя) или обединяване (затваряне на превключвателя), може да се генерират някои малки електрически дъги, както и механична еластичност във веригата, която ще задейства и изключи веригата за няколко милисекунди. Когато натиснете превключвател на светлината, този ефект не е очевиден; но когато прикачите прекъсване към падащия ръб на сигнал, този отскачащ ефект задейства тон прекъсвания. | Повече ▼ тук .

Разкъсване на веригата

Внедрих както хардуерна схема за отказ, така и подобна версия в софтуера. Но как точно прилагате софтуерен отказ? Лесно! След като се появи първият очакван задействане, „изчакайте“ достатъчно време, докато отскокът се уталожи, преди да започнете да слушате нови прекъсвания. Това може да бъде постигнато в няколко реда C:

void countRainCycles() { if (nextTimeRainIterrupt == 0 || nextTimeRainIterrupt

Функцията millis () връща текущото време за изпълнение в милисекунди, откакто Arduino беше включен. Също така си струва да се отбележи, че тези променливи трябва да бъдат дефинирани като нестабилни, за да инструктират компилатора да не оптимизира изпълнението и следователно да избягва неточни стойности по време на хардуерните прекъсвания.

Някак си ми трябваше станцията да съхранява натрупаните данни и периодично да изпраща тези измервания в база данни MySQL. Затова добавих Ethernet модул със SD слот, за да регистрирам стойностите и да ги изтегля всеки път, когато потребител (сървърът) се свърже със станцията. По време на тестване у дома с ADSL свързаност това работи удивително добре - но аз почти загубих косата си, когато тествах това „на поле“ с 3G интернет (с помощта на 3G модем), тъй като станцията щеше да се нулира на случаен принцип, когато се опитах да извлека измервания! След значително тестване, най-накрая установих, че примерите, предоставени в цяла Интернет, които описват „обслужване“ на данни на свързан клиент, не считат, че връзката може да е толкова лоша, че връзката с клиента може да бъде загубена при предаване в средата на пакета, причинявайки изходният буфер ще се препълни. Но защо отпаднала връзка ще доведе до препълване на буфер? Е, кажете, че сесията на предаване започва и станцията започва да попълва изходния буфер с данни. В идеалния случай клиентът консумира този буфер по-бързо, отколкото се запълва. При свързване с 3G модем обаче това не беше така! Връзката с клиента беше твърде лоша, така че буферът се запълваше по-бързо, отколкото беше изразходван, което доведе както до препълване на буфера, така и до внезапно рестартиране на станцията.

За да разреша проблема, трябваше да добавя функция към Ethernet библиотека снабден с Arduino, който е нещо подобно:

int EthernetClient::free() { if (_sock != MAX_SOCK_NUM) return W5100.getTXFreeSize(_sock); return 0; }

След това успях да проверя дали клиентът има малко място в буфера, преди да се опитам да го запълня с повече данни:

while (file.available() > 0) { if (client.free() > 0) { // This was key to solving the issue c = file.read(); client.print((char)c); } else { // No free buffer? Ok, I'll wait a couple of millis... delay(50); } } file.close();

Между другото, ако се интересувате от програмиране на Arduino, ето чудесен водач.

Друга интересна задача беше внедряването на дневник на LIFO. Защо беше необходимо това? Е, обикновено, когато записвам измервания в даден файл, подходът е прост: отворете файла, добавете новите проби до края и затворете файла. Но кажете, че искам да взема последните 1000 измервания, сортирани хронологично. Тези измервания са в края на файла; така че трябва да отворя файла, да преместя курсора до края, да изведа най-новите измервания, след това да върна курсора на файла обратно към предишното измерване и да го изведа, като търся пробен разделител, за да открия къде да започна и да спра. Arduino няма нито достатъчно RAM, нито мощност на процесора, за да изпълни този процес бързо, така че имах нужда от друг подход. Вместо това реших да изведа файла в обратен ред на сървъра и след това да върна низовите литерали обратно на страната на сървъра:

unsigned long filePosition = file.size(); file.seek(filePosition); while (filePosition >= 0) { if (client.free() > 0){ file.seek(filePosition); c = file.peek(); if (c != -1) { client.print((char)c); } if (filePosition <= 0) { break; } filePosition--; } }

С какъвто и да е опит като PHP разработчик е лесно да получите най-новите проби с героите в правилния ред:

// $output has the reversed string measures, each sample is delimited by ; $rows = split(';', trim($output)); array_walk_recursive($rows, 'reverseString'); if (strlen($rows[0]) == 0) { array_shift($rows); // Remove the first line if empty } function reverseString(&$row, $key) { $row = trim(strrev($row)); } // $rows is now the array of the latest samples :)

След това от страна на сървъра настройвам cron процес за извличане на последните измервания на всеки две минути и вмъкване на данните в MySQL двигател. За да покажа данните, създадох www.kitesurfcordoba.com.ar и използва jQuery за автоматично актуализиране на графиките (които са генерирани с помощта на pChart v2.0 , страхотна библиотека с отворен код).

Имаше куп други трикове, необходими, за да накарат нещата да работят, свързани както със софтуерното, така и с хардуерното инженерство, но се проточих достатъчно дълго - така че нека да говорим за минимизиране на поддръжката.

„Как мога да намаля поддръжката до (почти) нула?“

Това беше основна грижа, защото със сигурност не ми е лесно да стигна до гарата - ако бях готов да карам на два часа път, само за да поправя незначителна неизправност, тогава не би трябвало да я карам на първо място (аз не спомена това преди, но след всичко, което преживяхме, станцията всъщност е „тя“ и се казва Дороти).

И така, за какви грешки говорим тук? Е, например: софтуерът може да увисне, мрежата може да загуби свързаност, доставката на енергия може да се провали (и го прави) и т.н.

По същество станцията трябва да извърши възможно най-много самовъзстановяване. Ето защо използвах както меки, така и твърди пазачи . За тези, които не са запознати, пазачът е софтуер или хардуер, който проверява дали системата работи правилно и ако не, се опитва да я върне към живот. Arduino има вграден пазач, който можете да използвате. Настроих го да изчака 8 секунди: ако обаждането отнеме повече време от това ограничение, пазачът на софтуера ще нулира дъската.

wdt_enable(WDTO_8S); // 'wdt' stands for 'watchdog timer'

Обичам тази функция. Има обаче случаи, когато платката се нулира, а Ethernet модулът не. Защо? Е, това е относително достъпна платка за прототипиране, а не много скъпо, устойчиво на откази устройство (със сигурност не трябва да изграждате пейсмейкър с него). За да преодолея този недостатък, трябваше да хакна Arduino чрез кръстосано свързване на хардуерно нулиране на вход към цифров изход на самата платка. За да се избегне повторен цикъл, трябва да се добавят и няколко реда код:

void setup() { digitalWrite(RESET_ARDUINO_PIN, HIGH); // Set it to HIGH immediately on boot pinMode(RESET_ARDUINO_PIN, OUTPUT); // We declare it an output ONLY AFTER it's HIGH digitalWrite(RESET_ARDUINO_PIN, HIGH); // Default to HIGH, set to LOW to HARD RESET ...

След това успях да задам хардуерно нулиране на Arduino и всички модули отгоре му (включително модула Ethernet), като просто извиках digitalWrite(RESET_ARDUINO_PIN, LOW), което върна Дороти към живот след няколко секунди.

Освен това платката се рестартира автоматично след загуба на енергия. И ако интернет връзката не успее, ние използваме възможностите за съхранение на SD картата (данните могат да се съхраняват на картата повече от седмица и сървърът може да изтегли стари данни, за да възстанови липсващите проби). Комбинирането на всички тези функции ни дава изключително здрава метеорологична станция, която може да оцелее във враждебните условия, които е създадена за наблюдение. Като цяло това нещо ми струваше около 300 долара.

llc c corp или s corp

Графика на кръгова диаграма

И в крайна сметка

Станцията работи от декември 2012 г. Към днешна дата тя не се е провалила (или ако е, станцията се е възстановила достатъчно бързо, че кайтсърф общността и аз не забелязах). Има приблизително 500 кайт сърфисти, които редовно проверяват метеорологичната станция, преди да пътуват до мястото. Така освен наградата за решаването на някои трудни технически предизвикателства, имах и възможността да осигуря на куп хора по-приятно кайтсърфинг.

единПървоначално използвах Arduino uno . По-късно преминах към Arduino Mega поради необходимостта от увеличена RAM и флаш памет.

Свързани: Работа с ESP32 Audio Sampling

Esports: Ръководство за конкурентни видеоигри

Финансови Процеси

Esports: Ръководство за конкурентни видеоигри
Аржентинският разработчик Габриела Манчини спечели трета стипендия ApeeScape

Аржентинският разработчик Габриела Манчини спечели трета стипендия ApeeScape

Други

Популярни Публикации
Автоматизирани Android Crash Reports с ACRA и Cloudant
Автоматизирани Android Crash Reports с ACRA и Cloudant
Шаблони за терминологични листове - клаузи, за които трябва да се внимава по време на преговорите
Шаблони за терминологични листове - клаузи, за които трябва да се внимава по време на преговорите
Elasticsearch за Ruby on Rails: Урок за дъвчащия скъпоценен камък
Elasticsearch за Ruby on Rails: Урок за дъвчащия скъпоценен камък
Често срещани грешки в комуникацията с клиенти: Как да не разочаровате клиента си
Често срещани грешки в комуникацията с клиенти: Как да не разочаровате клиента си
Състезателно машинно обучение: Как да атакувате и защитавате ML модели
Състезателно машинно обучение: Как да атакувате и защитавате ML модели
 
С байпас на филтъра и някои шестнадесетични, хакнатите номера на кредитни карти все още са все още в състояние с Google
С байпас на филтъра и някои шестнадесетични, хакнатите номера на кредитни карти все още са все още в състояние с Google
UI срещу UX - Разгледайте основните разлики (Инфографика)
UI срещу UX - Разгледайте основните разлики (Инфографика)
Характеристики на Rails 6: Какво ново и защо е важно
Характеристики на Rails 6: Какво ново и защо е важно
Убедителен дизайн: Ефективно използване на напреднала психология
Убедителен дизайн: Ефективно използване на напреднала психология
Зелено за излитане - Вътре в електрическата самолетна индустрия
Зелено за излитане - Вътре в електрическата самолетна индустрия
Популярни Публикации
  • google dorks за кредитни карти
  • рубин на релсите срещу рубин
  • е soundcloud по-добър от spotify
  • информация за кредитни карти на реални хора
  • if($_post)
  • обработка (език за програмиране)
Категории
  • Начин На Живот
  • Уеб Интерфейс
  • Ux Дизайн
  • Процес На Проектиране
  • © 2022 | Всички Права Запазени

    portaldacalheta.pt