Русский
Русский
English
Статистика
Реклама

Arduino ide

Электронные часы в духе Cronixie

20.08.2020 00:09:36 | Автор: admin
Мне думается, что одним из самых постоянных, не теряющих своей нужности и актуальности сегментов рынка потребительской электроники были и остаются приборы определения текущего времени.
В одном из комментариев окрестили этот август месяцем DIY часов, и решил тоже рассказать о своей поделке.




Идея

Сама тема совершенно не нова, мне давно попадались похожие проекты, но на их повторение не хватало ресурсов: времени, знаний, навыков, пока
Уже не вспомню, на каком ресурсе увидел подобное устройство, и засело очень сильно желание сделать что-то подобное.

До начала работы, у меня был нулевой практический опыт работы с векторной 2D и 3D графикой и ЧПУ, а Windows мне до сих пор лень устанавливать. Шёл 4й месяц безработицы на фоне сильного эмоционального выгорания.

Отправной точкой стал вот такой чертёж в CDR:


Folker Stange // thingiverse.com

Здесь предложено использовать 3мм акрил и ленту WS2812b 144 диода/метр, это ячейка с одним SMD диодом 12 x 6.9 мм от этих метрик отталкивается вся последующая геометрия при создании чертежа.

Вроде, всё просто!

image
X-фильм // Банкомат, Lave, верёвка.

Но не мог же я с этим идти к станку или к станочнику и сказать хочу вот так!, макет нужно было подготовить свой. После попыток изготовить конвертируемый чертёж, были отметены как неподходящие IncScape, LibreCAD, FreeCAD; AutoCAD и CorelDraw под Wine не вариант, и тут мне попался BricsCAD нативная DWG совместимая САПР, в которой и по сей день работаю.



Параллельно, нужно было найти сам станок и доступ к нему, а в столице деревень их не так-то много.
Знакомые предложили обратиться в ФабЛаб строительного университета, упомянув, что там мне могут помочь с разработкой механической части. Написал в несколько организаций, и охотнее всего пошли на контакт в ФабЛаб ТюмГУ, там и печтатался. В качестве материала выбрал фанеру, т.к. она дешёвая и достаточно прочная для такого изделия.



Контуры цифр взяты здесь из макетов ГРИ (т.к. ещё не очень хорошо владел КАД-ом).



А пока разбирался с чертежом и печатью, подъехали рулон ленты и модные болтики с Ali.



Когда резали оргстекло, зашёл техник из соседнего отдела:
Вы так много режете из оргстекла? Оно же дорогое!
Красота требует жертв...



В итоге, нулевая сборка изначально состояла из неуклюже стоящих на четырёх ножках платформ с качающимися на них стёклышками, норовящими выпасть. /* оргстекло 3мм как в инструкции */

Первое слабое место проушины для скрепления, они были слишком тонкие и ломались.
Второе вертикальная установка на базу. Я не нашёл иного способа быстро соединить одно с другим, кроме как штырьевой вилкой с шагом 2,54мм (DIP) благо такие есть в каждом радиомагазине. Башенки сильно шатались, и пришлось прикрутить их к базе намертво, так что конструкция стала электрически неразборной (с выпадающими стёклами).
Устройство было подарено старому другу в накануне его бракосочетания и наверно, продолжает радовать по сей день.

Сборка 1

Условием ФабЛаба к сотрудничеству было создание второго экземпляра в пользу университета. Учёл ошибки, переписал код, и в этой и последующих сборках установка ламп стала горизонтальной, а-ля салазки.



Механизм понравился всем, и макет был распечатан, контуры цифр здесь уже отрисованы мной.



В сборе:



На фото видно подгоревшие линии: тогда ещё не знал, что такое поликарбонат, что он ядовит, и что его нельзя резать лазером, ибо при нагревании горит. Но результат был изготовлен и украшает коридор университетского ФЛ.
Цифры: если рез глубокий то передние контуры перекрывают свечение задних слоёв, и нужно технику в комментарии поставить жирный акцент на том, что это должна быть гравировка, а не рез.
Последующие итерации заказывал в лазерной мастерской, стёклышки из ПЭТ, бока и задняя стенка в последней редакции тоже стали из прозрачного материала (со светоотражающей плёнкой).




Железо




ESP8266 выбрана, потому что мне удобно собирать инструмент настройки в виде WEB-приложения. Ещё, под неё есть библиотека Ticker позволяющая выполнять функции по расписанию и отвязаться от loop();
Схема подключения на самом деле просто.



За каждыой 4-штырьковой розеткой лампа



Подобную схему соединения описывает AlexGyver в проекте пиксельного рюкзака, только здесь другая плотность.

ПО

Arduino IDE =)
Хорошая базовая русская документация по ESP8266 Arduino Core есть на wikihandbk.com, в скетчах-примерах, и в исходниках на гитхабе

Back-end

HTTP и WebSocket сервер, FTP, ArduinoOTA (чтобы каждый раз не искать провод), mDNS для OTA и DNSServer для имитации CaptivePortal в режиме точки доступа, работа с FastLED и RTC модулем, NTP клиент, математика RGB эффектов и плавных переходов

Front-end

HTML, JS (React, и немного jQueryUI), Bootstrap CSS.
Всё, что более или менее статично вёрстку, стили, скрипты, настройки WiFi, сохранённые пресеты, ещё что-то через HTTP: статичные настройки и пресеты удобно упаковывать в JSON и заливать как файл на фронте, а на бэке перечитывать через ArduinoJSON
Динамические значения текущее время, а так-же оттенки, интервалы, переходы, и другие байтовые параметры, которые живут в объекте EEPROM, быстрые команды по вебсокету.
Страница настройки отображения и эффектов у меня выглядит так:



Здесь, Scheduler отдельный класс на front и back части, применяющий сохранённые настройки по расписанию.
Проекту примерно год =)
Новые фишки можно дописывать сколько хватит фантазии.


И это всё?


Фото и видео работы на разных этапах разработки есть в соцсетях vk и instagram
И, пока сидел на карантине, собрал Живые обои для Android (на моём самсунге не завелось).



Есть так-же веб-демо-версия на Vue.JS, которую можно выкачать, обернуть в WebView, и запускать, например, как экранную заставку (на любимой платформе), переписать на таймер обратного отсчёта, или использовать в любых других своих нуждах. Там та же вёрстка, с теми же ресурсами, что в андроид-приложении.

А исходники?


Примеры реализаций с четрежами и прошивками можно найти на thingiverse, hackaday.io, instructables, они частично пересекаются с тем, что наглядно и залипательно, и ищется на: Яндекс.Картинках, Pinterest, Youtube
Это мой первый большой проект на плюсах, и он не претендует на авторитетность.

Спасибо за прочтение.
Всем добра, чистого, внятно комментированного и производительного кода ;)
Подробнее..

Погода в доме или бюджетный мониторинг CO2, PM2.5, температуры и влажности на ESP32 и Blynk

16.11.2020 14:12:10 | Автор: admin
По просьбах трудящихся в этой теме, решил сделать обзор-инструкцию, как можно сделать бюджетный измеритель CO2.

В данном обзоре я не буду описывать пагубность влияния CO2, а также низкой влажности на самочувствие и здоровье человека. Также, как и не буду доказывать, что без этого девайса не прожить. Об этом уже написаны тонны статей, как и споров в комментах. Я постараюсь лаконично описать создание максимально бюджетного устройства, но при этом измерительного устройства, а не показометра.

Также для максимальной простоты повторения, в обзоре выложу прошивку для ESP32 и проект Blynk.

Для создания нам понадобятся следующие комплектующие:

  • Датчик CO2 Senseair S8 $27,9
  • Микроконтроллер с Wi-Fi ESP32 (модель 30 pin) $3,2
  • Датчик температуры, влажности и давления BME280 $1,85 (опционально)
  • Датчик загрязнённости воздуха PM2.5 PMSA003 $14,9 (опционально)
  • Десяток коротких проводков, чтобы их соединить.

Ссылки на конкретных продавцов даны для примера, отбирал по количеству заказов, так как сам заказывал на Таобао.

Все датчики уже давно отлично себя зарекомендовали. Имеют очень хорошую точность, отличное соотношение цена/качество, и доставляют минимум проблем при настройке и эксплуатации. Тот же Senseair S8 используется в топовых бытовых приборах AirVisual Pro, которые по $300.

Сразу оговорюсь, что в данном случае не будет конечного устройства. Так как аппетит приходит во время еды, и захотелось ещё мониторить чистоту воздуха. Датчик же PM2.5 частиц только недавно приехал, и 3D-печатный корпус под это всё хозяйство буду проектировать попозже. Плюс хочу заказать у китайцев печатные платки, чтобы с проводами не возиться. Но корпус любой уже может сделать на своё усмотрение, главное помнить, что через корпус должен хорошо проходить воздух, и датчик температуры нужно держать подальше от всех остальных компонентов, так как они греются и могут завышать температуру.

Как я дошел до этого


DIY устройств на этих датчиках в интернете вагон и маленькая тележка. Но почему-то, в основном люди зациклены на создании, так сказать, Standalone-решений. Т.е. коробочка с датчиками и экраном, на который выводятся показания. Но я не в восторге от экранчиков от Nokia и всяких символьных 1604 и подобных, тем более хотелось бы видеть графики для анализа изменений. А хороший IPS экран, во-первых, будет стоить больше всех датчиков вместе взятых, во-вторых, может потребовать более мощного контроллера, в-третьих, потребует возни с нормальным интерфейсом (те же графики рисовать).

А поскольку занимаюсь web-разработкой, сразу же пришла мысль об отделении мух от котлет. Т.е. датчики занимаются только сбором данных и отправкой их на сервер. Ну, а с сервера мы можем получить эти данные в нужном виде и для нужного устройства. В простейшем виде можем просто показания посмотреть, но в то же время спокойно можем к эти данным привязать исполнительное устройство (например, включение приточной вентиляции или открытие форточки сервоприводом).

Blynk


Перед тем, как делать свой велосипед. Решил глянуть возможные готовые решения. Естественно есть различные сервисы для сбора данных Народный мониторинг, thingspeak и т.п. Но как-то они показались слишком громоздкими для моего случая. Различные системы умных домов, которые умеют работать с датчики, тоже из пушки по воробьям.

Blynk в первую очередь привлек своим дизайном, и хорошей документацией с примерами. Прошли считанные минуты на ознакомление, и вот уже на экране телефона выводится температура и влажность с красивыми графиками. В итоге было решено остановиться на нём. Тем более, что для Blynk, при желании, можно настроить локальный сервер.

Вот так выглядит проветривание 10 минут, в режиме откинутое окно (в районе 0 часов), потом CO2 довольно быстро поднимается, при том, что я сейчас один в квартире.



Вроде всё хорошо, CO2 быстро снизился до 410 ppm, но график PM2.5 увеличился в 2,5 раза, и температура упала на 2 градуса.

Увеличение PM2.5 при проветривании


Цены


Если вы планируете использовать сервера Blynk. То отображение всех тех графиков, что у меня не совсем бесплатно. В Blynk каждый виджет размещаемый в приложении стоит определенное количество энергии батарейки.



В моем случае используются следующие виджеты:

  • 5 x 400 Labeled Value
  • 1 x 300 Gauge
  • 3 x 900 SuperChart

Итого 5000 энергии. Бесплатно даётся 2000. Можно докупить недостающее. Энергия покупается однократно, и может использоваться бесконечно, а если вы удаляете какой-то виджет то энергия возвращается в полном объеме. И можно использовать повторно.

Также можно установить свой Blynk сервер. Либо есть альтернативные Blynk серверы почти без ограничения.

Ну и ещё вариант, заменив Labeled Value на Value Display можно сэкономить 1000, плюс убрать один или 2 графика. На одном графике можно выводить 4 показателя.

О датчиках


Датчики SenseAir S8 бывают нескольких сильно отличающихся модификаций. Для наших целей отлично подходит модификация 004-0-0053, и у себя использовал именно её. Обратите внимание, что S8 датчики есть для промышленного применения, с виду одинаковые, но на значительно большие диапазоны, к примеру модель 004-0-0024 измеряет от 400 до 32000 ppm (но при этом точность 1000 ppm, у модели 0053 точность 40 ppm), в домашних же условиях 400-800 ppm это хорошо, а больше 2000 ppm уже будет очень плохое самочувствие.

Обращаю внимание, что датчики температуры BME280 в виде готовых модулей, бывают на напряжение 3,3 В и на 5 В. В нашем случае нужен именно на 3,3 В.

Датчики пыли PM 2.5 бывают тоже несколько вариантов PMSA003-A (вход и выход воздуха с одной стороны) и PMSA003-C (вход и выход с противоположных сторон). Тут в принципе без особой разницы, зависит от того, как удобнее будет в корпусе. Также есть более старые поколения этого датчика PMS7003, PMS5003 (без дополнительных букв). Они также подойдут и должны работать с прошивкой без изменений, но они больше по размерам. Для датчика PMSA003 желательно купить переходник, так как там контактная площадка с шагом 1 мм, и подпаиваться проводами несколько напряжно.

Что касается самого модуля ESP32, то это по сути самая дешевая плата на базе ESP32. Прошивка должна работать и на других модификациях, если там соответствующие пины свободны.

Подключение


Схема подключения выглядит так.



Для тех кому привычнее буквы, а не картинки
BME280 (подключаем по I2C)
VCC ->3V3
GBD -> GND
SCL -> D22
SDA -> D21

S8
G+ -> Vin
G0 -> GND
UART_RxD -> TX2
UART_TxD -> RX2

PMSA003
(тут на некоторых переходниках есть обозначения, у меня нет, но порядок одинаковый)
VCC -> Vin (1) (жирная дорожка на переходнике намекает на VCC)
GND -> GND (2)
RxD -> D35 (4)
TxD -> D34 (5)

А так страшно выглядит это пока у меня вживую

Прошивка


Сначала хотел выкладывать это в виде скетчей для Arduino IDE. Но тогда придется ещё рассказывать, как пользоваться этим самым Arduino. Поэтому для увеличения уровня доступности решил сделать готовую прошивку и добавить WiFi менеджер.

При первой загрузке, или, когда не удаётся подключиться к сети, девайс переходит в режим точки доступа, и создаёт сеть вида esp32_eae234 (где после esp32 кусочек серийного номера чипа, т.е. он будет разный).

Вы на смартфоне открываете список сетей и подключаетесь к этой сети. После чего телефон скажет, что для подключения нужно открыть браузер (точно также как в различных WiFi сетях магазинов, кафешек и т.п.). В браузере открывается страничка, в которой можно из списка доступных сетей выбрать нужную, ввести пароль для неё, а также ввести Token для Blynk.

Проект для Blynk можно будет клонировать просто отсканировав QR-код. И в дальнейшем вы сможете либо использовать его в готовом виде, либо изменить его под себя.

Саму же прошивку с инструкциями по установке и исходники, опубликую попозже. Хотелось бы получить обратную связь по необходимым функциям, ну и несколько добровольцев для опытов, чтобы можно было провести закрытое beta-тестирование, прежде, чем выкладывать в открытый доступ. Если будет востребовано, то могу и сайтик организовать, чтобы можно было обновления выкладывать.

Материалы по теме


mysku.ru/blog/china-stores/75648.html
mysku.ru/blog/china-stores/75322.html
sprut.ai/client/blog/730
habr.com/ru/post/482352
wiki.liutyi.info/display/CO2/AirVisual+inside

P.S.


Кстати, выяснилось, почему так увеличивался PM 2.5 при проветривании, оказывается в очередной раз что-то горит под Киевом. И сейчас Киев вошел в 10-ку городов мира с самым грязным воздухом. Причем почувствовал запах гари я значительно позже, чем начал показывать датчик. Так что тоже полезно, сигнализировать, что сейчас не время для проветриваний.

156 это показания в местных попугаях, а в PM 2.5 это 64 g/m.

Подробнее..

Победа над nRF24L01 на три шага ближе

25.02.2021 00:07:45 | Автор: admin

Многие испытывают трудности при соединении по эфиру радиомодулей nRF24L01. Об этом свидетельствует тема на форуме Амперки, открытая в конце 2014г. За пять с небольшим лет в теме накопилось более 120(!) страниц. Это при том, что автор темы не просто обозначил проблему, а поделился своим трехнедельным опытом победного для него боя. Кроме того, он тут же в первом сообщении создал навигатор по страницам темы, где приводит ссылки на решения проблемы другими. Этот своеобразный путеводитель постоянно обновляется.



Я тоже не из тех счастливчиков, которым легко удалось связать радиомодули. Ниже мой подход к решению проблемы.



Модули nRF24L01 работают в полудуплексном режиме. Это как разговор порации: каждый из корреспондентов в один момент времени либо говорит, либо слушает. То есть, каждый из двух узлов работает в режиме и приемника и передатчика: передатчик, отправив сообщение ждет на подтверждение приема сообщения со стороны приемника.



Как правило, все тесты, которые мне встречались в Инете, сводятся к проверке работы и качества связи пары радиомодулей в полнофункциональном режиме, когда передатчик, послав пакет, ждет на подтверждение приема пакета приемником.



Я же разделил эту задачу на несколько простых задачек. Вначале модули проверяются на работоспособность и правильность подключения (шаг 1), затем один из пары работающих радиомодулей тестируется на работу в режиме передатчика без ожидания отклика с приемника (шаг 2) и последний этап улучшение качества связи в этой связке передатчик-приемник (шаг 3).



Итак ...





Шаг 1



Загрузить в контроллер платы Ардуино скетч сканера эфира, который можно найти среди примеров Arduino IDE: Файл -> Примеры -> RF24 -> scanner. Ниже под спойлером есть этот скетч с несущественным изменением. В нем изменено время между стартом и остановкой сканирования одного канала с 128 мксек на 512 мксек. Увеличение времени позволило за один цикл выявлять бОльше источников помех и сигналов. Это равнозначно замене результата измерений в канале на сумму результатов в этом канале за четыре цикла сканирования эфира до изменения времени задержки. При этом, время прохода всего прослушиваемого диапазона сканером увеличилось несущественно: примерно с 8-ми до 10-ти сек.



В разных скетчах адрес канала в командах приводится в разных форматах: в одних ...(0x6f), в других ...(112). Перевод с одного формата в другой станет понятным с примера перевода. Например, для (0x1а) это: (1+1)*16 + а = (1+1)*16 + 10 = 42. Отсчет каналов начинается с частоты 2,4 ГГц, далее идет увеличение частоты на 1 МГц с увеличением номера канала на 1.



скетч сканера эфира
/*Победа над nRF24L01: на три шага ближе, сканер эфираhttp://personeltest.ru/aways/habr.com/ru/post/476716/*//*  Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>  This program is free software; you can redistribute it and/or  modify it under the terms of the GNU General Public License  version 2 as published by the Free Software Foundation.*//**   Channel scanner   Example to detect interference on the various channels available.   This is a good diagnostic tool to check whether you're picking a   good channel for your application.   Inspired by cpixip.   See http://arduino.cc/forum/index.php/topic,54795.0.html*/#include <SPI.h>#include "nRF24L01.h"#include "RF24.h"#include "printf.h"//// Hardware configuration//// Set up nRF24L01 radio on SPI bus plus pins 9 & 10RF24 radio(9, 10); //Arduino UNO//// Channel info//const uint8_t num_channels = 128;uint8_t values[num_channels];//// Setup//void setup(void){  //  // Print preamble  //  Serial.begin(57600);  Serial.println("Scanner Air On");  printf_begin();  //  // Setup and configure rf radio  //  radio.begin();  radio.setAutoAck(false);  // Get into standby mode  radio.startListening();  radio.stopListening();  // Print out header, high then low digit  int i = 0;  while ( i < num_channels )  {    printf("%x", i >> 4);    ++i;  }  printf("\n\r");  i = 0;  while ( i < num_channels )  {    printf("%x", i & 0xf);    ++i;  }  printf("\n\r");}//// Loop//const int num_reps = 100;void loop(void){  // Clear measurement values  memset(values, 0, sizeof(values));  // Scan all channels num_reps times  int rep_counter = num_reps;  while (rep_counter--)  {    int i = num_channels;    while (i--)    {      // Select this channel      radio.setChannel(i);      // Listen for a little      radio.startListening();      delayMicroseconds(512);      radio.stopListening();      // Did we get a carrier?      if ( radio.testCarrier() )        ++values[i];    }  }  // Print out channel measurements, clamped to a single hex digit  int i = 0;  while ( i < num_channels )  {    printf("%x", min(0xf, values[i] & 0xf));    ++i;  }  printf("\n\r");}// vim:ai:cin:sts=2 sw=2 ft=cpp



Далее подключаем модуль nRF24L01 к плате Ардуино или любому прототипу, собранному, допустим, на контроллере ATMEGA328P. Я собрал два образца на платах для прототипирования на контроллере ATMEGA328P по схеме контроллер + резонатор. Один образец подключаю к компу через плату Arduino UNO, а второй через конвертор USB/TTL.

Мощность стабилизатора платы Arduino UNO вполне приемлема для подключения дополнительной импульсной нагрузки такой, как nRF24L01+ c адаптером 5В/3,3В для этого модуля или без адаптера.





На мониторе последовательного порта Arduino IDE увидите нечто похожее:





Если вы увидели похожую картинку тест на работоспособность (исправность) радиомодуля и правильность его подключения пройден успешно. Замените радиомодуль другим, с которым планируете работать дальше.



Обратите внимание на чистый диапазон, начиная с канала 4а. У меня он остается чистым даже, если на расстоянии нескольких метров работает старая СВЧ-печь мощный источник помех в этом диапазоне. А в общем-то, в Интернете рекомендуют выбирать каналы для своих проектов выше 60.



Если на каналах шум, но радиомодуль определяется (смотрим преамбулу на мониторе Arduino IDE, подробно тут) это однозначно копия (подделка). Не отчаивайтесь ее тоже можно запустить.



Шаг 2



По схеме, аналогичной первой собираем второй радиоузел. Это будет передатчик. В его контроллер загружаем скетч передатчика (под спойлером).



скетч приемника
/*Победа над nRF24L01: на три шага ближе, приемникhttp://personeltest.ru/aways/habr.com/ru/post/476716/*/#include <SPI.h>#include <RF24.h>RF24 radio(9, 10); // порты D9, D10: CSN CEconst uint32_t pipe = 111156789; // адрес рабочей трубы;byte data;void setup() {  Serial.begin(115200);  Serial.println("TransmitterTester ON");  radio.begin();                // инициализация  delay(2000);  radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS  radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit  radio.setPALevel(RF24_PA_MAX); // уровень питания усилителя RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX  radio.setChannel(0x6f);         // установка канала  radio.setAutoAck(false);       // автоответ  radio.setRetries(0, 15);  //время между попыткой достучаться, число попыток  radio.powerUp();               // включение или пониженное потребление powerDown - powerUp  radio.stopListening();  //радиоэфир не слушаем, только передача  radio.openWritingPipe(pipe);   // открыть трубу на отправку}void loop() {  data = 109;  radio.write(&data, 1);  Serial.println("data= " + String(data));}



Передатчик без пауз в работе передает сигнал на канале 6f (112).



Подаем питание на сканер эфира и передатчик. Присмотритесь что творится на канале 6f и соседних с ним каналах. Сканер эфира при включенном передатчике рано или поздно прорисует единички или другие одноразрядные числа в шестнадцатиричном исчислении в области 6f, на который запрограммирован передатчик. Наберитесь терпения, особенно при работе со сканером из примеров.





Увидев сигнал от передатчика делаем следующий шаг.



Шаг 3



Загружаем вместо сканера скетч приемника (под спойлером).



скетч приемника
/*Победа над nRF24L01: на три шага ближе, передатчикhttp://personeltest.ru/aways/habr.com/ru/post/476716/*/#include <SPI.h>#include "nRF24L01.h"#include "RF24.h"RF24 radio(9, 10); // порты D9, D10: CSN CEconst uint32_t pipe = 111156789; // адрес рабочей трубы;byte data[1];int scn;  //счетчик циклов прослушивания эфираint sg;  //счетчик числа принятых пакетов с передатчикаvoid setup() {  Serial.begin(9600);  Serial.println("ReceiverTester ON");  radio.begin();  // инициализация  delay(2000);  radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS  radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit  radio.setChannel(0x6f);         // установка канала  radio.setAutoAck(false);       // автоответ  radio.openReadingPipe(1, pipe); // открыть трубу на приём  radio.startListening();        // приём}void loop() {  if (scn < 1000)  { // прослушивание эфира    if (radio.available())    {      radio.read(data, 1);      if (data[0] == 109) {        sg++;      }    }  } else {//всего принято    {      Serial.println("Принято: " + String(sg) + " пакетов");      sg = 0;    }    scn = 0;  }  scn++;  delay(20);  if (scn >= 1000) scn = 1000; //защита от переполнения счетчика}



Логика работы приемника такая же, как и у сканера эфира, но он в отличие от сканера принимает сигналы только на частоте передатчика 6f и, как и сканер, не посылает автоответ. Скорость обмена информацией и размер контрольной суммы у приемника такие же, как у передатчика. После каждых 1000-и циклов прослушивания в скетче обнуляется счетчик числа циклов и выводится инфа о количестве принятых пакетов с передатчика в монитор порта Arduino IDE.



Включаем передатчик и приемник. Если приемник принимает хотя бы каждый третий пакет это уже успех. У меня не получилось. Приемник по непонятным причинам принимал максимум 40 пакетов.



Подумал о увеличении мощности передаваемого сигнала с помощью дополнительной антенны. Для начала, подключил зажимом монтажный провод папа-мама к корню штатной антенны. И счастье привалило сразу 999 принятых пакетов!



Юзерам, которые захотят сделать все грамотно, придется поработать. Дополнительная антенна в данном случае это отрезок коаксиального кабеля с волновым сопротивлением 50 Ом и длиной 115 мм. Антенна подключается к выводу 13 (АNT2) микросхемы nRF24L01+. Схему подключения и номиналы нескольких недостающих smd компонентов, которые надо поставить на плату радиомодуля, можно найти на принципиальной электрической схеме nRF24L01+ тут. Впрочем, есть альтернатива в магазин за NRF24L01+PA+LNA





Теперь обязательно припаиваем между пинами GND и VCC обеих радиомодулей по два конденсатора. Керамический конденсатор, выполняющий роль ВЧ-фильтра, емкостью не менее 0,15 мкФ (чем больше, тем лучше) и электролит емкостью около 10 мкФ (можно и больше, но бесполезно) это НЧ-фильтр. ВЧ-фильтр шунтирует высокочастотные помехи по цепи питания радиомодуля, а НЧ-фильтр сглаживает пульсации питания. Для надежности, цепи питания радиомодулей лучше непосредственно подпаять к пинам контроллеров.



Все. Надеюсь, у вас в дальнейшем поубавится проблем с nRF24L01 в своих проектах. Успехов!



Безусловно эти простые шаги не могут гарантировать решение всех проблем с nRF24L01 мне их и не перечесть, но теперь вы, как и я, будете уверены:


  • радиомодули не бракованные;
  • подключены верно;
  • уровень сигнала передатчика, чуствительность приемника удовлетворительны и, в случае необходимости, обеспечиваются дополнительной антенной;
  • пара nRF24L01+ однозначно работает в режиме передатчик-приемник без откликов и их ожидания. Иногда этого достаточно.


Ссылки по теме



  1. Обзор радио модуля NRF24L01+
  2. nRF24L01+: побеждаем модуль.
  3. nRF24L01 и Ардуино: побеждаем модуль (видео)
  4. SE8R01. Подделка под NRF24L01 (видео)
  5. Обзор радио модуля NRF24L01+PA+LNA
Подробнее..

На распутье Ардуино, Cи или Ассемблер?

22.03.2021 10:20:41 | Автор: admin

Сначала короткая предыстория появления этого поста. Относительно давно, помигав светодиодом, захотелось сделать что-то полезное. Так появился Беспроводной программируемый по Wi-Fi комнатный термостат с монитором качества воздуха и другими полезными функциями. Как назло, в это время перестал работать мой промышленный термостат. Меня выручила еще сырая поделка, наспех спрятанная в картонную коробочку. За время отопительного сезона напрягал лишь один недостаток прототипа это необходимость таскать по квартире удлинитель 220В и кабель, который всегда путался под шваброй ногами. Поэтому решил сделать нечто похожее, но автономное, притом, с питанием от батареек, как в серийном образце. Тут я завис надолго.


Приступая к задаче, для меня было очевидно одно вряд ли программы промышленных автономных устройств составлены на платформе Arduino IDE. Где все спрятано в громоздкие тяжеловесные библиотеки, а простые коды (скетчи) занимают в редакторе несколько десятков строк, делая работу в этой среде комфортной и не требующей особых усилий. Уточню сразу дальше речь выборе языка программирования между Ардуино, Си или Ассемблером. Хотя, понятно, на потреблении устройства в целом сказывается слишком много факторов таких, как энергопотребление подключенных модулей, потребление самого контроллера, который управляет периферией, не последнюю роль тут играет оптимальное построение самого кода и алгоритм работы устройства.


направу ехати женату быти; налеву ехати богату быти


В начале пути, перед выбором направления меня оптимистично настроила статья Почему многие не любят Arduino. Ниже, для наглядности, картинка оттуда с кодом мигалки.




Пример слева написан на языке Ардуино, а справа работа непосредственно с регистрами. Код на Ардуино выглядит несколько компактней, чем та же мигалка, но с использованием регистров.


На изображении ниже компиляция кода мигалки на Ассемблере. Как видно, былая компактность испарилась количество строк в 3 раза больше, чем в Ардуино.





И так, с 2 картинок выше видно размер памяти, занимаемой в контроллере кодом мигалки одним светодиодом, написанным на Ардуино, составляет 1030 байт, на Си 176 байт, на Ассемблере 42 байта.


Теперь взглянем на более сложный код. Поскольку в своих проектах использую модуль давления-температуры BMP280, составил код барометра-термометра на Си, чтобы заодно была какая-то польза.


барометр-термометр на Си
/*    На распутье - Ардуино, Cи или Ассемблер?    http://personeltest.ru/aways/habr.com/ru/post/547752/ */#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include "bmp180/bmp180.c"#include "uart.c"#include <stdio.h>#include <stdlib.h>#include <string.h>#include "nokia/nokia5110.h"int main(void) {    serial_init();    DDRD |= (1 << 7);  //pin 13, atmega328p    PORTD &= ~(1 << 7);    nokia_lcd_init();    while (1) {        init_sensor(bmp180_mode_0);        calculate();        PORTD |= (1 << 7);        _delay_ms(100);        printf("Temperature: %.2f C, Pressure: %.2f Pa, \n", (float) bmp_180.temperature / 10, (float)bmp_180.pressure);        nokia_lcd_clear();        nokia_lcd_write_string("789",1);        nokia_lcd_set_cursor(0, 10);        nokia_lcd_write_string("22.2", 3);        nokia_lcd_render();        _delay_ms(2000);        PORTD &= ~(1 << 7);        _delay_ms(100);        int a=54325;        char buffer[20];        itoa(a,buffer,2);   // here 2 means binary        printf("Binary value = %s\n", buffer);        itoa(a,buffer,10);   // here 10 means decimal        printf("Decimal value = %s\n", buffer);        itoa(a,buffer,16);   // here 16 means Hexadecimal        printf("Hexadecimal value = %s\n", buffer);    }    return 0;}

В проект входят следующие компоненты: контроллер ATMEGA328P, модуль давления-температуры BMP180 и дисплей Nokia 3110. ATMEGA328P принимает инфу с датчика BMP180 и после преобразований отображает ее на дисплее Nokia 3110, затем спит. Сон задается сторожевым таймером Watchdog. Проект собирается в Atmel Studio 7 и эмулируется в Proteus 8 Pro. Этот проект Atmel Studio был создан для отладки кода в Proteus'e. В библиотеке Proteus 8 Pro модуля BMP280 нет, поэтому пришлось составить код с включением BMP180. Светодиод в коде для наглядности, чтобы придать динамику статичной картинке.




Ниже электрическая схема устройства. При монтаже схемы обращайте внимание на функциональное назначение выводов контроллера и модулей. Подключение кварца XTAL1, XTAL2 (ATMEGA328P). Уточню, схему барометра-термометра на BMP180 я "в железе" не собирал, поэтому тут могут проявиться проблемы, которые не видны при эмуляции в Proteus'e.





Для скачивания zip-файла проекта в Atmel Studio 7 перейдите по ссылке тут все виртуальные проекты и коды программ из этой публикации.


Файл прошивки bmp180-nokia3110-watchdog-1.hex для Proteus'а находится в папке Debug. В файле main.c есть закомментированный код барометра-термометра на BMP280. Его электрическая схема такая же, как и у барометра-термометра на BMP180. Он успешно собирается в Atmel Studio 7 и работает "в железе". Для работы "в железе" пришлось внести изменения в строке #define BMP280_ADDR 0x77 файла библиотеки bmp280.c, а именно: заменить начальный адрес 0x77 на 0x76. Не забудьте сделать эту корректировку, если будете использовать в своих проектах код барометра-термометра на BMP280 из main.c, с уже подключенной библиотекой bmp280.c.


Ниже код этого же барометра-термометра в платформе Arduino IDE. Естественно, с другими библиотеками.


барометр-термометр на Ардуино
/*    На распутье - Ардуино, Cи или Ассемблер?    http://personeltest.ru/aways/habr.com/ru/post/547752/ */#include <SPI.h>#include <LowPower.h>#include <SimpleTimer.h>#include <Adafruit_BMP280.h>#include <Adafruit_GFX.h> //https:esp8266.ru/forum/threads/esp8266-5110-nokia-lcd.1143/#post-16942#include <Adafruit_PCD8544.h> //https:esp8266.ru/forum/threads/esp8266-5110-nokia-lcd.1143/#post-16942Adafruit_BMP280 bmp280;float Press, Tin; //давление, температураAdafruit_PCD8544 display = Adafruit_PCD8544(5, 7, 6);void setup() {  Serial.begin(9600);  display.begin();  // display.clearDisplay();  display.setContrast(60); // установка контраста  while (!bmp280.begin(BMP280_ADDRESS - 1)) {    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));    delay(100);  }}void loop() {  // измерение температуры, давления  Tin = bmp280.readTemperature();  Press = bmp280.readPressure() / 133.3;  Serial.println("Temperature: " + String(Tin) + "*C");  Serial.println("Pressure: " + String(Press) + "mm Hq");  display.clearDisplay();  //давление, мм рт.ст.  {    display.setTextSize(1);    display.setCursor(20, 5);    display.println (Press, 0); // нет знаков после запятой    display.setCursor(41, 5);    display.println("mmHq");  }  //температура, *C  {    display.setTextSize(2);    display.setCursor(15, 20);    display.println (Tin, 1); // один знак после запятой    display.setCursor(66, 20);    display.println("C");  }  display.display();  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);}

Ресурсы, потребляемые программой барометра-термометра на Си и в Arduino IDE наглядно показаны на картинке:




Как видно, эти примеры потребляют 5954 байт (С) и 12956 байт (Arduino IDE) в Flash. Соотношение изменилось с 6-ти раз для мигалки до 2-х с небольшим. К сожалению, линейной зависимости нет чем объемней код, тем меньше соотношение размеров памяти Ардуино к Си. В идеале на этой картинке должен присутствовать 3 столбец с кодом на Ассемблере, но такого кода в Интернете я не нашел, а составить код самому мне не под силу.


Попутно замечу, что использование компилируемых в Arduino IDE библиотек и функций на С/С++ особо имеет смысл в тех случаях, когда размер занимаемой памяти превышает или близок к размеру памяти контроллера. Мне, например, часто удается уходить от предупреждения: Недостаточно памяти, программа может работать нестабильно.





Теперь посмотрим еще один вариант это цифровой термометр-гигрометр на AM2302 (DHT22), ATtiny13 и MAX7219, код которого составлен на Ассемблере.


Автор статьи задался целью разработать простой термометр-гигрометр выполненном на одном из самых маленьких микроконтроллеров ATtiny13 с весьма скромными характеристиками 1Кб программной памяти, 64 байтами ОЗУ и 5 интерфейсными выводами. Он решил эту непростую задачку, выбрав Ассемблер, заодно вспомнив те далекие времена, когда код можно было составлять на низкоуровневых языках, используя машины типа ZX-Spectrum.


Ниже скриншот со сборкой данного кода в Atmel Studio 7.





Код устройства на Ассемблере занимает 738 байт памяти в контроллере. Безусловно, программа барометра-термометра, о котором шла речь выше, будь ее код составлен на Ассемблере, заняла бы больше места. По нескольким причинам в схеме реализовано управление дисплеем Nokia3110 по интерфейсу SPI (это 5 линий связи, тут 3), связь с датчиком BMP280 осуществляется по протоколу I2C (2 линии, тут 1) и дополнительные символы, которые позволяют не гадать температура это или другой параметр.


Из того, что я нашел в Интернете, можно утверждать, Ассемблер даст выигрыш в размере кода для относительно больших проектов процентов 10-20 по сравнению с Си. Но надо учитывать, что в больших проектах Си может уменьшить размер кода за счёт лучшей оптимизации.


Код Ассемблера выполняется практически на машинном уровне: один цикл одна команда. В качестве аргумента приведу пример из справочника по командам ассемблера AVR. Установка бита в регистре ввода/вывода SBI A, b. Эта команда устанавливает заданный бит в регистре ввода-вывода. На выполнение этой операции контроллерами megaAVR потребуется 2 цикла и на tinyAVR, XMEGA 1 цикл. Для схемы с контроллером ATtiny13 и резонатором 9,6 МГц выполнение команды займет один цикл, то есть 1/9600000 Гц = 0,104 мксек.


Выполнение похожей операции на языке Си, например, задать состояние порта PORTB = 32; займет в этой же схеме не меньше времени. А о Ардуино и говорить нечего там придется выполнить объемную функцию void digitalWrite(uint8_t pin, uint8_t val);. Подробно о размерах кода в Си и Ардуино читайте тут.


Поэтому разработчики серийных продуктов, как правило, пишут коды на низкоуровневых языках. С тем, чтобы разместить программу в контроллере с меньшей памятью. Тут работают законы экономики контроллер с меньшими ресурсами стоит дешевле, следовательно себестоимость изделия становится ниже.


Теперь о энергосбережении немножко издали. Вспомним, что код Ассемблера выполняется на машинном уровне: один цикл одна или несколько команд. в зависимости от типа контроллера. Это десятые доли микросекунды. То есть, на выполнение программы с размером несколько десятков байт уйдут единицы-десятки микросекунд. Дальше контроллер бесконечно будет крутить этот набор 0 и 1, затрачивая энергию на перезаряд емкости затворов сотен полевых транзисторов, на которых построен кристалл контроллера, а также чтение и записи данных в его память. Длительность периода повтора будет зависеть только от размера кода в памяти контроллера, неважно на каком языке он составлен. Просто на Ассемблере он будет наименьшим, а на Ардуино наибольшим. Соответственно, период цикла для кода на Ассемблере наименьший, на Ардуино наибольший.


Уменьшить эти затраты можно остановив процессор или программно уменьшив частоту его работы. В Ассемблере переход в "спящий" режим сна выполняет функция управления контроллером SLEEP. В других можно использовать функцию WDT (WatchDog Timer), а в Ардуино еще и функцию LowPower.powerDown (SLEEP_1S, ADC_OFF, BOD_OFF), заодно отключив все лишнее, что не используется в конкретной задаче. В эффективности этой функции сможет убедиться каждый, заменив в скетче мигалки (скетч на картинке вначале статьи) функцию отсчета времени delay(1000); этой функцией и включив в разрыв питания контроллера амперметр. Да, не забудьте подключить библиотеку LowPower.h. На Си это сделал автор этой статьи. Ток в цепи питания attiny13a с паузой 1,5мА, со сном 240мкА. Потребление в 6(!) раз меньше.


Допустим, вы намерены собрать барометр-термометр и задумываетесь о энергосбережении. Понятно, что давление/температура в заданной разрядности не изменятся за несколько минут, которые для контроллера целая вечность. Ему можно выделить это время для сна. После сна он снова выполнит свою работу: примет информацию с датчика, преобразует в понятные для человека циферки и выведет все это на дисплей. И в таком режиме работа-сон он будет крутиться, пока не сядут батарейки. Объем работы контроллера, вернее время, которое контроллер будет занят выполнением работы, зависит от того, на каком языке составлена программа барометра-термометра. Если есть возможность загрузить в контроллер код на выбор ArduinoIDE, C, Assembler, с одинаковым временем сна, то в каком из трех предложенных вариантов батарейки сядут раньше (позже)? Мой ответ ArduinoIDE (Assembler).


Кстати, настоятельно рекомендую хотя бы вскользь посмотреть Реальная правда о Программистах ненавидящих Arduino. Поучительный материал. Автор подробно описывает свою историю от первых радостей мигания светодиодом и чуда по тем временам вывода температуры на дисплей от мобилки до Ардуино с дельными советами.


Так куда же идти? На мой взгляд, для любителей, как я, это платформа Arduino IDE с низкоуровневыми вставками. Тем же, кому тесно в Ардуино, в С. Assembler не освоить за несколько месяцев. Да и осваивать не имеет особого смыла коды на С можно оптимизировать иногда до размеров не намного больше, чем в Ассемблере.


Спасибо за внимание. Всего наилучшего!


Ссылки по теме


Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru