Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Подписаться Другие автора:
Мне нравятся микроконтроллеры PIC, и мне нравится программировать на языке ассемблера. Фактически, за последние пару лет я разместил на своем веб-сайте около 40 проектов, основанных на этой комбинации. Недавно я заказывал некоторые детали у одного из моих любимых поставщиков в США и заметил Arduino Nano с кабелем для программирования всего за 1,20 доллара больше, чем простой процессорный чип ATMEGA328. Я купил пару штук. Затем я загрузил IDE Arduino и стер с себя память о программировании на «C ++».
Этот проект представляет собой смесь часов, использующих GPS для измерения времени, и радиочастотного приемника, который декодирует сообщения о погоде от обычного датчика AcuRite. Результатом является отображение времени и температуры в небольшом масштабе. GPS-часы и погодные программы настроены как отдельные включаемые файлы, поэтому можно легко перейти к основной программе и настроить ее так, чтобы она выполняла только функцию часов или только функцию погоды. Просто раскомментируйте соответствующий «#define» в верхней части основной процедуры, если вам нужна только одна из функций.
Если используются обе функции, то в верхней строке ЖК-дисплея отображается местное время, а в нижней строке ЖК-дисплея отображается влажность и температура в градусах Цельсия и Фаренгейта. Если используется только функция часов, то в верхней строке отображается местное время, а в нижней строке отображается всемирное координированное время. Если используется только функция погоды, то в верхней строке отображается первый полученный датчик, а в нижней строке отображается любой другой полученный датчик. Я добавил эту возможность, потому что у меня есть два датчика погоды.
Шаг 1: датчик погоды
Используемый здесь датчик погоды AcuRite отправляет информацию о температуре и влажности каждые 16 секунд. На оборотной стороне указан номер модели 000592TXR, но обычно она рекламируется как модель 06002M. Этот датчик используется во многих различных моделях метеостанций, поэтому его легко найти, и я смог купить их на eBay менее чем за 20 долларов. AcuRite продает похожие датчики для некоторых из своих метеостанций, но они могут придерживаться или не придерживаться одного и того же протокола связи. В Интернете есть сведения о том, что датчик температуры 00606 использует тот же формат сообщения, но с недопустимым байтом влажности.
Как видно из первого сигнала, показанного выше, сообщения о погоде отправляются пакетами с интервалом в 2 мс между последовательными сообщениями. Вторая форма волны, показанная выше, расширяет часть одного сообщения, чтобы увидеть длительность битов и шаблоны. Есть четыре бита синхронизации с высотой около 600 мксек, за которыми следует низкий уровень 600 мксек. Биты данных представлены высотой 400 мкс, за которой следует низкий уровень 200 мкс (1) или высокий уровень 200 мкс, за которым следует низкий уровень 400 мкс (0).
Формат сообщения состоит из 7 байтов данных. Первые два байта - это идентификатор датчика, и они не меняются (т. Е.: он не использует скользящий код). Последний байт представляет собой простую аддитивную контрольную сумму первых шести байтов. Третий байт является индикатором уровня заряда батареи и всегда должен быть равен 44 шестнадцатеричным, если батарея исправна. Четвертый байт - это влажность, и это немасштабируемое значение от 0 до 99. Важно помнить, что старший бит байтов 4, 5 и 6 является битом четности и не является частью измерения. ценности. Байты 5 и 6 представляют собой масштабированную температуру (по Цельсию), при этом младшие 4 бита байта 5 объединены с младшими 7 битами байта 6 для формирования 11-битового значения. Температура всегда представлена как положительное число и становится отрицательной только при применении масштабирования. Масштабирование составляет (C / 10) - 100. Деление на 10 требуется, поскольку разрешение по температуре составляет десятые доли градуса. Вычитание требуется, потому что датчик прибавляет 100, чтобы передаваемое значение оставалось положительным.
Шаг 2: радиочастотный приемник
Радиочастотный модуль, который я использую для этого проекта, - RXB6. Это супергетеродинный приемник в отличие от менее желательных супрегенеративных приемников. Если вы посмотрите на дешевые радиочастотные модули, вы обнаружите, что платы передатчика и приемника часто собираются вместе. Большинство из этих комплектных приемников относятся к суперрегенеративным типам, поэтому они, как правило, имеют гораздо более низкие рабочие характеристики (включая дальность действия), чем супергетеродинные приемники. Для этого проекта нам нужен только модуль приемника, потому что мы будем получать сигналы от передатчика датчика погоды.
Шаг 3: антенны RF
RXB6 не имеет антенны. Вы можете купить несколько спиральных антенн довольно дешево, но также легко сделать свою антенну. Фактически, соединительный кабель макета можно надеть на антенный штырь модуля, если вы не хотите преувеличивать. В идеале прямая проволочная антенна будет иметь длину 1/4 волны, что составляет около 6,8 дюйма. Сначала я установил перемычку, и у меня не было проблем со съемкой внешнего датчика, хотя моя мастерская электроники находится у меня в подвале.
Другой вариант - сделать спиральную антенну своими руками. В сети есть множество планов для этого, но тот, что показан на картинке выше, - это то, что я сделал. Я использовал твердый сердечник из обрезков кабеля Ethernet и намотал его на гладкий хвостовик сверла диаметром 5/32 дюйма. Оставьте изоляцию включенной, за исключением наконечника, который припаивается к плате RF. Вам понадобится 20 витков. Вы также можете использовать сверло 7/32 дюйма и вместо этого намотать 17 витков. Любой из них, вероятно, будет отлично работать для диапазонов, которые вы, вероятно, используете для своих датчиков. Настоящий ключ - это для начала иметь хороший радиоприемник. Датчики AcuRite также имеют довольно сильные передатчики.
Шаг 4: протокол связи RF
Существует несколько различных методов модуляции для передачи данных, но в этих датчиках используется самый простой из них - OOK (включение-выключение) или ASK (амплитудно-сдвиг-манипуляция). Поскольку в этом примере мы имеем дело с битами данных 0/1, амплитуда полная или полная. Итак, для наших целей OOK и ASK - это одно и то же, потому что OOK означает, что оператор RF либо полностью включен, либо полностью отключен. Формат сообщения обычно определяется производителем передающего устройства, и они могут использовать практически любую скорость передачи, любой стиль форматирования бит и любую длину сообщения. Полоса 433 МГц забита передачей для таких вещей, как интеллектуальные счетчики и т. Д., Поэтому необходимо настроить программное обеспечение для фильтрации только того формата сообщений, который мы хотим использовать.
Шаг 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 (всемирное координированное время). Предложения NMEA состоят из символов ASCII, которые могут быть напрямую выведены на ЖК-дисплей. Временная часть имеет формат ЧЧММСС. FF (часы, минуты, секунды и доли секунды). Для наших часов дробная часть бесполезна, поэтому нам нужно иметь дело только с шестью символами. Проблема в том, что затем вам нужно преобразовать ваше местное время в 12-часовой формат AM / PM, если вы этого хотите. Но иногда проблемы - это то, что делает жизнь интересной, так что в этом и заключается суть этой части программного обеспечения.
Что касается часовых поясов, вы можете подумать, что их просто будет 24, причем 12 из них к востоку от местоположения UTC (+ зоны) и 12 к западу от местоположения UTC (- зоны). На самом деле, есть несколько чудаков, которые являются неполными часами, и пара, превышающая 12-часовой «предел». Если вам посчастливилось жить в одном из этих районов, я прошу прощения, потому что мое программное обеспечение учитывает только 24 полные часовые зоны. Некоторые из нас также используют летнее время часть года, но это не учитывается автоматически в программном обеспечении. Для этого потребуется справочная таблица будущих дат, дополнительная сложность программного обеспечения и необходимость обновления программного обеспечения, если недели в году для переключения изменились. Вместо этого оборудование использует мгновенный контактный переключатель, чтобы упростить настройку часового пояса (смещение по всемирному координированному времени).
Шаг 7: Схема
Схема показана выше и включает подключения для 4-битного интерфейса 1602 LCD. Последовательные данные от РЧ-приемника находятся на уровнях цифровой логики, поэтому они подключаются напрямую к одному из входных контактов Arduino. Вывод настроен в программном обеспечении для выполнения функции прерывания при изменении, чтобы мы могли измерять ширину импульса. Выход GPS TXD напрямую подключен к входу Arduino RX.
Используются два переключателя. Как упоминалось ранее, мгновенный контактный переключатель позволяет установить смещение по всемирному координированному времени. Переключатель можно нажать в любой момент, чтобы войти в установленный режим. Первоначально на дисплее отображается недопустимое смещение UTC, равное «+77». Инструкции по настройке смещения UTC см. В разделе «Программное обеспечение часов».
Второй переключатель - это простой переключатель включения / выключения. В положении «выключено» время будет отображаться в 12-часовом формате (AM / PM), а в положении «включено» время будет отображаться в 24-часовом формате. Этот переключатель можно изменить в любое время для переключения между форматами.
Если требуется только функция часов, то модуль РЧ-приемника не нужно подключать. Если требуется только функция погоды, то GPS и два переключателя подключать не нужно.
Шаг 8: программное обеспечение ЖК-дисплея
Я предпочитаю использовать один из двух типов ЖК-интерфейсов. Один является стандартным 4-битным интерфейсом, а другой - 3-проводным интерфейсом, использующим регистр сдвига. Я разработал этот интерфейс, когда работал с небольшими микроконтроллерами PIC, у которых было ограниченное количество контактов ввода / вывода. Я использовал 4-битный интерфейс для этого проекта, но у меня есть собственный включаемый файл ЖК-дисплея вместо использования общей библиотеки ЖК-дисплея Arduino. Это снижает потребление памяти и сложность кода, а также позволяет мне настраивать код для конкретных проектов, подобных этому.
Шаг 9: Программное обеспечение часов
Устройство GPS выводит стандартные предложения NMEA-0183, которые представляют собой строки ASCII, содержащие различную информацию. Для этого приложения я выбрал предложение GGA, чтобы получить информацию о времени, потому что это предложение я использовал для предыдущего проекта GPS. Поля информации в предложениях NMEA разделяются запятыми, поэтому после обнаружения заголовка предложения GGA программное обеспечение обычно подсчитывает запятые и вызывает соответствующую процедуру для каждого желаемого поля информации GPS. Здесь нужна только информация о времени, и она находится в поле после первой запятой, поэтому подсчет не требуется.
Шесть временных цифр (ЧЧММСС) буферизуются, а затем обрабатываются после их получения. GPS может вывести некоторые неполные сообщения на ранней стадии, поэтому процедура буферизации проверяет, является ли каждый символ числовым значением ASCII. Если получен неверный символ, сообщение отбрасывается. Это также может происходить в редких случаях во время нормальной работы, особенно если связь через последовательный порт немного падает. Я видел это только один раз, и все, что произошло, - это то, что время остановилось на секунду, а затем подскочило на две секунды вместо одной.
Если программное обеспечение настроено только на отображение времени, то в первой строке ЖК-дисплея будет отображаться местное время, а во второй строке - всемирное координированное время. Для 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 не требует точного определения местоположения для вывода времени, поэтому он должен выводить сообщения, как только получит один спутник. До тех пор на дисплее будет отображаться «НЕТ ДАННЫХ».
Шаг 10: ПО для погоды
Микроконтроллер PIC может включать / выключать таймер с помощью внешнего импульса. Тот же самый входной импульс может также использоваться как внешнее прерывание, чтобы сигнализировать о считывании длительности импульса. У Arduino нет такой возможности, поэтому я использовал функцию прерывания при изменении. На одном фронте импульса РЧ-сообщения текущее время в микросекундах сохраняется обработчиком прерывания. На противоположном фронте рассчитывается прошедшее время для определения ширины импульса.
В программном обеспечении есть определение «DEBUG», которое позволяет отображать формат необработанных данных полученных сообщений. Также существует определение для указания входного контакта Arduino для последовательного потока от РЧ-приемника. Программное обеспечение настроено на вычисление соответствующих настроек регистра прерывания при изменении на основе этого определения. Расчет работает только для цифровых контактов Arduino. Вместо этого можно использовать аналоговый вывод, но это потребует жесткого кодирования значений регистров.
Обработчик прерывания определяет, достаточно ли длинного захваченного счетчика, чтобы быть стартовым импульсом. Как упоминалось ранее, промежуток между несколькими сообщениями составляет 2 мс, поэтому программное обеспечение именно это и ищет. Из-за всего трафика 433 МГц первоначальная проверка в программном обеспечении гарантирует, что измеренное время составляет не менее 1,8 мс, но не более 2,4 мс. После обнаружения запуска программное обеспечение ищет биты синхронизации (600 мкс) и считает, чтобы убедиться, что четыре из них получены. После прохождения этих тестов программное обеспечение ищет правильное время разряда 200 мкс и 400 мкс.
Полученные биты формируются в байты, и каждый байт сохраняется. После получения семи байтов контрольная сумма сообщения проверяется, прежде чем разрешается дальнейшая обработка. Если необработанные байты должны выводиться (режим отладки), то байты преобразуются в символы ASCII и отправляются на ЖК-дисплей. Если требуются выходные данные по влажности и температуре, выполняются соответствующие преобразования.
Два байта данных по шкале Цельсия в сообщении RF смешиваются вместе, образуя 11-битное значение. Нижняя часть сдвигается влево на один бит, чтобы удалить бит четности и выровнять его с битами в верхней части. Два байта формируются в 16-битную переменную слова, а затем все это сдвигается вправо на один бит, чтобы получить окончательное выравнивание битов. Затем слово переменная преобразуется в переменную с плавающей запятой для математических вычислений.
Одним из больших преимуществ использования C ++ на Arduino по сравнению с языком ассемблера на PIC является то, что он упрощает математические вычисления. Как упоминалось ранее, преобразование по шкале Цельсия составляет (C / 10) -100. Результат преобразуется в строку и отправляется на ЖК-дисплей для отображения. Расчет по Фаренгейту равен (C * 1,8) + 32. Результат снова преобразуется в строку и отправляется на ЖК-дисплей для отображения. В обоих случаях преобразование String включает знак минус (при необходимости) и десятичную точку. Выполняется проверка десятичной точки, чтобы гарантировать, что на дисплей отправляется только один символ после десятичной точки. Эта проверка необходима, поскольку длина строки может составлять от 3 до 5 символов.
У меня есть два датчика AcuRite, поэтому я добавил проверку в программное обеспечение, чтобы гарантировать, что данные для одного не перезаписывают данные для другого, если программное обеспечение настроено только на функцию погоды. Первый датчик, полученный после включения питания, отображается в строке 1, а другой - в строке 2. Используя режим отладки, я могу увидеть идентификатор каждого датчика, чтобы я мог просто проверить код, если я только хотел обработать данные от одного из них.
Программное обеспечение отслеживает состояние батареи (байт 3) и отображает сообщение, если оно указывает на низкий заряд батареи. Это сообщение перезаписывает все остальные данные для этого датчика.
Шаг 11: дисплеи
Вот несколько примеров дисплеев для различных функций. У меня есть несколько других инструкций, но большинство моих проектов микроконтроллеров PIC можно найти на моем веб-сайте: www.boomerrules.wordpress.com