Съдържание:

Показване на времето и времето на Arduino 3 в 1: 11 стъпки
Показване на времето и времето на Arduino 3 в 1: 11 стъпки

Видео: Показване на времето и времето на Arduino 3 в 1: 11 стъпки

Видео: Показване на времето и времето на Arduino 3 в 1: 11 стъпки
Видео: How to use up to 10 push button switch with 1 Arduino input pin ANPB-V1 2024, Ноември
Anonim

От Boomer48 Следвайте още от автора:

Използване на ATtiny85
Използване на ATtiny85
Използване на ATtiny85
Използване на ATtiny85
Инструмент за разделяне на пай и подрязване на многоъгълници
Инструмент за разделяне на пай и подрязване на многоъгълници
Инструмент за разделяне на пай и подрязване на многоъгълници
Инструмент за разделяне на пай и подрязване на многоъгълници
Цифрови контроли за ръчен аудио усилвател
Цифрови контроли за ръчен аудио усилвател
Цифрови контроли за ръчен аудио усилвател
Цифрови контроли за ръчен аудио усилвател

Харесвам PIC микроконтролерите и обичам програмирането на асемблер. Всъщност през последните няколко години публикувах около 40 проекта на моя уебсайт въз основа на тази комбинация. Наскоро поръчах някои части от един от любимите си доставчици в САЩ и забелязах Arduino Nano, с кабел за програмиране, само за 1,20 долара повече от чип процесор ATMEGA328. Затова купих няколко от тях. След това изтеглих Arduino IDE и изтрих паметта си от програмирането на „C ++“.

Този проект е съвкупност от часовник, който използва GPS за определяне на времето и RF приемник, който декодира метеорологичните съобщения от общ сензор AcuRite. Резултатът е малък мащаб на показване на времето и температурата. GPS часовникът и метеорологичните процедури са настроени като отделни включващи файлове, така че е лесно да влезете в основната рутина и да я конфигурирате да изпълнява само функцията часовник или само функцията за времето. Просто декомментирайте подходящото „#define“в горната част на основната рутина, ако искате само една от функциите.

Ако се използват и двете функции, горният ред на LCD дисплея показва местното време, а долният ред на LCD дисплея показва влажността и температурата както по Целзий, така и по Фаренхайт. Ако се използва само функцията за часовник, тогава горният ред показва местно време, а долният ред показва UTC. Ако се използва само метеорологичната функция, горният ред показва първия получен сензор, а долният показва всеки друг получен сензор. Добавих тази възможност, защото имам два сензора за времето.

Стъпка 1: Сензор за времето

Сензор за времето
Сензор за времето
Сензор за времето
Сензор за времето
Сензор за времето
Сензор за времето

Използваният тук сензор за времето AcuRite изпраща информация за температурата и влажността на всеки 16 секунди. На гърба той показва номер на модел 000592TXR, но обикновено се рекламира като модел 06002M. Този сензор се използва от много различни модели метеорологични станции, така че е лесен за намиране и успях да ги взема на eBay за под 20 долара. AcuRite продава сензори с подобен вид за някои от техните метеорологични станции, но те могат или не могат да се придържат към същия комуникационен протокол. Има някои индикации в мрежата, че сензорът само за температура 00606 използва същия формат на съобщението, но с невалиден байт за влажност.

Както се вижда в първата форма на вълната, показана по -горе, метеорологичните съобщения се изпращат поредици с интервал от 2 ms между последователни съобщения. Втората форма на вълната, показана по -горе, разширява част от едно съобщение, за да види продължителността и моделите на битовете. Има четири бита за синхронизиране, които са високи около 600us, последвани от 600us ниски. Битовете данни са представени с височина 400us, последвана от 200us ниска (1) или 200us висока, последвана от 400us ниска (0).

Форматът на съобщението се състои от 7 байта данни. Първите два байта са ID на сензора и те не се променят (т.е. не използва подвижен код). Последният байт е проста добавена контролна сума на първите шест байта. Третият байт е индикатор за нивото на батерията и винаги трябва да е 44 шестнадесетичен, ако батерията е добра. Четвъртият байт е влажността и това е мащабирана стойност между 0 и 99. Важно е да се има предвид, че най-значимият бит от байтове 4, 5 и 6 е бит за паритет и не е част от измерването стойности. Байтове 5 и 6 са мащабираната температура (Целзий), като долните 4 бита от байт 5 са свързани заедно с по-ниските 7 бита от байт 6, за да образуват 11-битова стойност. Температурата винаги се представя като положително число и става отрицателна само когато се приложи мащабирането. Мащабирането е (C / 10) - 100. Разделянето на 10 е необходимо, тъй като температурната разделителна способност е в десети от градуса. Изваждането е необходимо, защото сензорът добавя 100, за да запази предадената стойност положителна.

Стъпка 2: RF приемник

RF приемник
RF приемник
RF приемник
RF приемник

RF модулът, който използвам за този проект, е RXB6. Това е супер хетеродин приемник за разлика от по -малко желаните супер регенеративни приемници. Ако погледнете евтините радиочестотни модули там, ще откриете, че предавателните и приемните платки често са свързани заедно. Повечето от тези пакетни приемници са супер регенериращи, така че те са склонни да имат много по -ниски характеристики (включително обхват) от супер хетеродинните приемници. За този проект се нуждаем само от приемния модул, защото ще получаваме сигнали от предавателя на сензора за времето.

Стъпка 3: RF антени

RF антени
RF антени

RXB6 не се доставя с антена. Можете да закупите някои спираловидни доста евтино, но също така е лесно да направите своя собствена антена. Всъщност, кабелът на джъмпера за макет може да се плъзне върху щифта на антената на модула, ако не искате да станете прекалено фантастичен. В идеалния случай една права телена антена би била 1/4 дължина на вълната, която работи до около 6,8 инча. Първоначално направих нещо с джъмпера и нямах проблем да взема външния си сензор, въпреки че работилницата ми по електроника е в мазето ми.

Друга възможност е да направите своя собствена спирална антена. Има различни планове за това в мрежата, но този, който е показан на снимката по -горе, е това, което направих. Използвах малко жила с твърдо ядро от скрап от Ethernet кабел и го навих около гладката дръжка на свредло 5/32 инча. Оставете изолацията включена, с изключение на върха, който се запоява към RF платката. Ще ви трябват 20 оборота. Можете също така да използвате свредло 7/32 инча и вместо това да увиете 17 завоя. Всяко от тях вероятно ще работи добре за диапазоните, които вероятно ще имате за вашите сензори. Истинският ключ е да имате добър RF приемник за начало. Сензорите AcuRite също имат доста силни предаватели.

Стъпка 4: RF комуникационен протокол

Има няколко различни техники за модулация за предаване на данни, но тези сензори използват най-простия, който е OOK (включване-изключване) или ASK (амплитудно изместване-клавиш). Тъй като в този пример имаме работа с битове данни 0/1, амплитудата е пълна или пълна. Така че, за нашите цели, OOK и ASK са едни и същи, защото OOK означава, че RF носителят е пълен или пълен. Форматът на съобщението обикновено се определя от производителя на предаващото устройство и те могат да използват почти всяка скорост на предаване, всеки стил на форматиране на битове и всяка дължина на съобщението. 433-MHz честотната лента е пълна с предавания за неща като интелигентни измервателни уреди и т.н., така че софтуерът трябва да бъде настроен да филтрира само за формата на съобщението, който искаме да използваме.

Стъпка 5: Данни за времето

Данни за времето
Данни за времето

Използвам евтин GPS блок, за да получа точни данни за времето, които автоматично ще се рестартират след прекъсване на захранването. Имам няколко GPS устройства (без дисплеи), които извеждат стандартните NMEA изречения, но най-малката и най-евтината от единиците, които имам, е NEO-6M. Модулът NEO-6M е лесен за свързване към Arduino, тъй като използва сериен порт на ниво TTL. Единствената реална разлика е, че стандартът NMEA определя серийна скорост на предаване от 4800, но по подразбиране NEO-6M е 9600 бода. Можете да стартирате безплатната програма „u-center“, за да промените скоростта на предаване, но аз просто я оставих по подразбиране. Има и безплатна помощна програма, наречена GPSInfo (пусната от Globalsat), която е много удобна за преглед на GPS информация на компютъра. Можете да свържете GPS модула към стандартен USB към TTL кабел, за да го проверите или да го настроите с помощта на компютър. Имайте предвид, че GPS чипът на модула всъщност работи при 3.3 волта (чрез вграден регулатор на напрежението), така че ако искате да се свържете към неговия RXD порт, трябва да изместите нивото от 5 волта. TXD портът може да се свърже директно с Arduino или компютъра.

Стъпка 6: Часови зони

Показването на GPS време е лесно да се направи, стига да искате да показвате UTC (Universal Time Coordinated). Изреченията на NMEA са съставени от ASCII знаци, които могат да бъдат изведени директно на LCD дисплея. Часовата част е във формат HHMMSS. FF (часове, минути, секунди и частични секунди). За нашия часовник дробната част не е полезна, така че всичко, с което трябва да се справим, е шест знака. Проблемът е, че след това трябва да конвертирате в местното си време и в 12-часов AM/PM формат, ако искате това. Но понякога проблемите правят това, което прави живота интересен, така че точно за това е частта от софтуера.

Що се отнася до часовите зони, може би си мислите, че просто ще има 24 от тях с 12 от тях източно от UTC местоположението (+ зони) и 12 от тях западно от UTC местоположението (- зони). Всъщност има няколко странни, които са частични часове и двойка, която надвишава 12 -часовия „лимит“. Ако случайно живеете в някоя от тези области, извинявам се, защото софтуерът ми отчита само 24 -те часови зони. Има и някои от нас, които използват лятното часово време през годината, но това не се отчита автоматично в софтуера. Това ще изисква таблица за търсене на бъдещи дати, допълнителна сложност в софтуера и необходимост от актуализиране на софтуера, ако седмиците в годината за преминаването се променят. Вместо това хардуерът използва превключвател за моментни контакти, за да позволи лесна настройка на часовата зона (UTC отместване).

Стъпка 7: Схеми

Схематично
Схематично

Схемата е показана по-горе и включва връзките за 4-битов 1602 LCD интерфейс. Серийните данни от RF приемника са на цифрово логическо ниво, така че са свързани директно към един от входните пинове на Arduino. Пинът е конфигуриран в софтуера да изпълнява функция за прекъсване при промяна, така че да можем да измерваме импулсните ширини. Изходът на GPS TXD е директно свързан към входа на Arduino RX.

Използвани са два превключвателя. Както бе споменато по -рано, моментният превключвател за контакт позволява настройка на UTC изместване. Превключвателят може да бъде натиснат по всяко време, за да влезете в зададения режим. Първоначално дисплеят ще покаже невалидно UTC отместване на „+77“. Вижте раздела „Софтуер за часовник“за инструкции за настройка на изместване на UTC.

Вторият превключвател е прост превключвател за включване/изключване. В позиция "изключено" времето ще се показва в 12-часов формат (AM/PM), а в положение "включено" времето ще се показва в 24-часов формат. Този превключвател може да бъде променен по всяко време, за да превключвате между формати.

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

Стъпка 8: LCD софтуер

Склонен съм да използвам един от двата типа LCD интерфейси. Единият е стандартният 4-битов интерфейс, а другият е 3-жичен интерфейс, който използва регистър за смяна. Проектирах този интерфейс, когато работех с малки PIC микроконтролери, които имаха ограничен брой I/O пинове. Използвах 4-битовия интерфейс за този проект, но имам собствен LCD включващ файл, вместо да използвам общата Arduino LCD библиотека. Това намалява консумацията на памет и сложността на кода, а също така ми позволява да оправя кода за конкретни проекти като този.

Стъпка 9: Софтуер за часовник

GPS устройството извежда стандартни NMEA-0183 изречения, които са ASCII низове, които съдържат разнообразна информация. За това приложение избрах GGA изречение, за да получа информация за времето, защото това е изречението, което използвах за предишен GPS проект. Полетата с информация в изреченията на NMEA са разделени със запетаи, така че след като се открие заглавката на изречението GGA, софтуерът обикновено преброява запетаи и извиква съответната рутина за всяко желано поле от информация с GPS. Тук е необходима само информация за времето и тя е в полето след първата запетая, така че не е необходимо броене.

Шестте времеви цифри (HHMMSS) се буферират и след това се обработват, след като всички са получени. GPS може да изведе някои непълни съобщения в началото, така че буфериращата програма проверява дали всеки символ е числова стойност ASCII. Ако се получи лош знак, съобщението се изхвърля. Това може да се случи и в редки случаи по време на нормална работа, особено ако комуникацията на серийния порт спада малко. Виждал съм това само веднъж и всичко, което се случи, е, че времето спря за секунда и след това скочи две секунди вместо една.

Ако софтуерът е конфигуриран да показва само време, тогава първият ред на LCD дисплея ще показва местно време, а вторият ред ще показва UTC. За UTC софтуерът просто изпраща символите ASCII директно в рутината на дисплея, с двоеточия (:) вмъкнати по подходящ начин.

За да се преобразува UTC в местно време, трябва да се приложи изместването на UTC (часова зона). Тъй като UTC времето от GPS е във формат ASCII, софтуерът преобразува часовите знаци ASCII в десетични и след това добавя изместването на UTC. UTC изместването се съхранява като положителна BCD стойност със знаков бит, така че първо се преобразува в целочислена стойност и след това се отрича, ако знаковият бит е зададен. След като се изчисли стойността на местния час, се използва справочна таблица, за да се преобразува в BCD, след което BCD се преобразува обратно в ASCII за показване. Таблицата за търсене трябва да обработва 24-часовия UTC формат, както и +/- 12 часови зони. За да направите това, UTC часовете от 0000 до 2300 заемат средните 24 записа в таблицата с 12 записа преди и 12 записа след отчитането на часовите зони. Една таблица е в 12-часов формат, така че добавих и таблица за търсене за AM/PM част на дисплея. Другата таблица е в 24-часов формат. Както бе споменато по-рано, превключвателят за включване/изключване позволява избор на 12-часов или 24-часов формат.

Часовата зона се извлича от EEPROM по време на инициализация и се показва за кратко. Ако не е зададен поне веднъж, се извиква рутинната настройка. Програмата за настройка също може да бъде извикана по всяко време чрез натискане на превключвателя за моментни контакти. Програмата за настройка ще инициализира дисплея на „UTC OFFSET +77“. Кратко натискане на превключвателя ще промени стойността на “-00”. Ако се изисква положителна часова зона, тогава друго кратко натискане ще промени стойността на „+00“. Продължителното натискане (> 1 секунда) ще премести режима на настройка към следващата стъпка. В този момент всяко кратко натискане ще увеличи стойността на времето до максимум 12. След достигане на желаната часова зона, натиснете и задръжте превключвателя за повече от 1 секунда и след това го освободете. След това софтуерът ще запише UTC стойността в EEPROM и за кратко ще покаже „OFFSET SAVED“. Ако направите грешка по време на влизане, просто излезте и след това натиснете отново ключа, за да го нулирате.

NEO-6M не изисква добро фиксиране на позицията, за да изведе времето, така че трябва да извежда съобщения веднага щом получи един сателит. Дотогава на дисплея ще пише „NO DATA“.

Стъпка 10: Софтуер за времето

Микроконтролерът PIC има възможност за включване/изключване на таймер с помощта на външен импулс. Същият входен импулс може да се използва и като външно прекъсване за сигнализиране на отчитане на продължителността на импулса. Arduino няма тази точна възможност, затова използвах функцията за прекъсване при промяна. На единия ръб на импулса на RF съобщение текущото микросекундно време се записва от манипулатора на прекъсване. На противоположния ръб се изчислява изминалото време, за да се определи ширината на импулса.

Софтуерът има дефиниция „DEBUG“, която позволява показване на необработения формат на данните на получените съобщения. Има и дефиниция за определяне на входния щифт на Arduino за серийния поток от RF приемника. Софтуерът е настроен да изчислява подходящите настройки на регистъра за прекъсване при промяна въз основа на тази дефиниция. Изчислението работи само за цифровите щифтове на Arduino. Вместо това може да се използва аналогов щифт, но това ще изисква твърдо кодиране на стойностите на регистъра.

Манипулаторът на прекъсвания определя дали уловеният брой е достатъчно дълъг, за да бъде пусков импулс. Както бе споменато по -рано, разликата между множество съобщения е 2 ms, така че софтуерът търси точно това. Поради целия 433-MHz трафик, първоначалният скрининг в софтуера гарантира, че измереното време е най-малко 1,8 ms, но не по-голямо от 2,4 ms. След като бъде открит стартът, софтуерът търси битовете за синхронизиране (600us) и брои, за да се увери, че са получени четири от тях. След като тези тестове преминат, софтуерът търси подходящите времена на битове от 200us и 400us.

Получените битове се оформят в байтове и всеки байт се записва. След получаване на седем байта контролната сума на съобщението се проверява, преди да бъде разрешена по -нататъшна обработка. Ако трябва да се изведат необработени байтове (режим за отстраняване на грешки), тогава байтовете се преобразуват в ASCII символи и се изпращат на LCD. Ако се желаят изходи на влажност и температура, тогава се извършват съответните преобразувания.

Двата байта данни за градуса по Целзий в RF съобщението се машират заедно, за да образуват 11-битова стойност. Долната част се измества наляво с един бит, за да се елиминира битът за паритет и да се приведе в съответствие с битовете в горната част. Двата байта се оформят в 16-битова променлива на думата и след това всичко се премества правилно с един бит, за да се получи окончателното подравняване на бита. След това думата променлива се преобразува в променлива с плаваща запетая за математическите изчисления.

Едно голямо предимство на използването на C ++ на Arduino спрямо асемблерния език на PIC е, че опростява математическите изчисления. Както бе споменато по -рано, конвертирането на по Целзий е (C / 10) -100. Резултатът се преобразува в низ и се изпраща на LCD дисплея за показване. Изчислението по Фаренхайт е (C * 1.8) + 32. Резултатът отново се преобразува в низ и се изпраща на LCD дисплея за показване. И в двата случая преобразуването на String включва отрицателния знак (ако е подходящо) и десетичната запетая. Прави се проверка за десетичната запетая, за да се гарантира, че само един знак след десетичната запетая е изпратен на дисплея. Тази проверка е необходима, тъй като низът може да варира от 3 до 5 знака по дължина.

Имам два сензора AcuRite, затова добавих проверка в софтуера, за да се уверя, че данните за единия не презаписват данните за другия, ако софтуерът е настроен да изпълнява само функцията за времето. Първият сензор, получен след включване, се показва на ред 1, а другият се показва на ред 2. Използвайки режима за отстраняване на грешки, мога да видя какъв е идентификационният номер за всеки сензор, за да мога да направя проста проверка в кода, ако само искаше да обработи данни от един от тях.

Софтуерът следи състоянието на батерията (байт3) и показва съобщение, ако показва изтощена батерия. Това съобщение презаписва всички други данни за този сензор.

Стъпка 11: Дисплеи

Дисплеи
Дисплеи
Дисплеи
Дисплеи
Дисплеи
Дисплеи

Ето някои примерни дисплеи за различните функции. Имам няколко други инструкции, но повечето от проектите ми за PIC микроконтролер могат да бъдат намерени на моя уебсайт на адрес: www.boomerrules.wordpress.com

Препоръчано: