Автоматическое освещение atmega328 (pir)

Автоматическое освещение AtMega328 (PIR)

Была просьба сделать автоматическое включение и выключение двух светильников и вот после выполнения работы решил залить тему, вдруг пригодится кому. Суть в чем: Есть небольшая комната формой “Г”, проходят через нее часто, но не задерживаясь. Освещается она 2 настольными светильниками включенными в розетки.

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

 Код написан на языке processing с прошивкой через Arduino IDE.

Было решено не делать разрыв в проводах ламп, а сделать отдельную розетку. Реле устраняют разрыв в проводе питания и лампы включаются. Пины arduino боятся достаточно большой взаимоиндукции реле и для того что бы сберечь им жизнь, ставим обратные диоды. Реле подключаются не напрямую, а через маленького посредника, транзистор (NPN), который подключается через резистор. 

Собираем на макетке используя Arduino Uno. PIR датчики движения имеют 3 ноги, питание (+5, GND) и цифровой. При движении на цифровую ногу подается HIGH (длину сигнала можно регулировать подстроечным резистором). 2 ноги подключаем к Arduino от датчиков. 

Переходим к схеме. Вся схема разделена на 2 узла: узел ключей и узел релюшек. 

Сам узел ключей выглядит так.

С AtMeg'и берем питание и 2 цифровой выхода. При подачи на 2 цифровых выхода HIGH транзисторы проводят GND на узел реле..

Узел реле.

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

ПП и её чучело. 

Ну и результат.

Узел Реле был спрятан в розетку для большей компактности. 

/*Black, Alehin, 2016.*/ const uint64_t time1_1;
const uint64_t time2_1;
const uint64_t time3_1;
const uint64_t time1_2;
const uint64_t time2_2;
const uint64_t time3_2; void setup() { Serial.begin(9600); pinMode(4, INPUT); //PIR 1 pinMode(5, INPUT); //PIR 2 pinMode(2, OUTPUT); //relay 1 pinMode(3, OUTPUT); //relay 2 digitalWrite(4, LOW); digitalWrite(5, LOW); }
void loop()
{ if (digitalRead(4) == HIGH) //засекаем время с начала срабатывания PIR 1 {digitalWrite(2, HIGH); time1_1 = millis();} if (digitalRead(5) == HIGH) //засекаем время с начала срабатывания PIR 2 {digitalWrite(3, HIGH); time1_2 = millis();} if (digitalRead(4) == LOW) //включаем relay 1 на 30 секунд { time2_1 = millis(); time3_1 = time2_1 – time1_1; if (time3_1 >= 30000) { digitalWrite(2, LOW);} } if (digitalRead(5) == LOW) //включаем relay 2 на 30 секунд { time2_2 = millis(); time3_2 = time2_2 – time1_2; if (time3_2 >= 30000) { digitalWrite(3, LOW);} } }

Скачать список элементов (PDF)

Источник: http://cxem.net/arduino/arduino182.php

Автоматическая подсветка лестницы

Добрый день, уважаемые читатели, хотел бы вас ознакомить со своей версией проекта автоматической подсветки лестницы на основе контроллера Arduino Pro Mini.

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

Цель проекта: смонтировать подсветку лестницы на второй этаж при следующих условиях.

  1. Автоматика срабатывает только в темное время суток.
  2. Каждая ступенька лестницы подсвечивается после включения предыдущей.
  3. Ступеньки подсвечиваются снизу вверх и наоборот.
  4. Есть запас времени полностью подсвеченной лестницы.

В качестве контроллера использовал всем знакомый Arduino Pro Mini.

Сначала о самой лестнице количество ступеней 11, ширина 550 мм. В общей сложности необходимо 6 м светодиодной ленты (заказал 2 шт по 5 м 5050 SMD), со степенью защиты IP67 (то есть защита от пыли и воды), чтобы можно было протереть пыль и не задумываться о том, попадешь ли под напряжение или повредишь ленту.

После подключения 5-ти м светодиодной ленты ток через нее оказался всего 2,5 A, то есть, для 6-ти м светодиодной ленты нужен блок питания на 36 Вт. Выбор остановился на китайском блоке питания 12 В 8.3 А 100 Вт. 100, конечно, много, но 12 В понадобилось для другого проекта, поэтому подключился к нему же.

В качестве питания самого контроллера, а также сенсоров (питание 5 В) использовал простенькую схему понижения напряжения с помощью стабилизатора напряжения L7805CV и двух керамических конденсаторов 0,1 мкФ и 0,33 мкФ.

В качестве датчиков фиксирующих движение остановился на ультразвуковых сенсорах HC-SR04, так как испускают узкий пучок ультразвуковых импульсов и можно настроить расстояние срабатывания.

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

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

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

Далее рассмотрим вопрос количества использованных контактов 11 цифровых для ступеней, 4 для двух сенсоров и один аналоговый для измерения освещенности. Итого 15 цифровых, что не дает нам Arduino. Недолго думая, использовал микросхему 74НС595N, а точнее каскад из двух сдвиговых регистров для увеличения количества цифровых выходов Arduino.

Почитав литературу и мнения радиолюбителей, поставил керамический конденсатор 0,1 мкФ на 12-ой ножке STcp первого регистра, якобы для минимизации шума при подачи «защелкивающего» импульса. При опробовании мною каскада «на столе», действительно с конденсатором работает лучше, в особенности при первой подачи питания на микросхемы.

Одно дело подключать к Arduino слабую нагрузку, наподобие светодиода, другое подключать кусок светодиодной ленты, длиной 500-550 мм (максимальный ток цифрового выхода Arduino 40 мА). Более доступно для меня оказалась микросхема ULN2003A (сборка Дарлингтона), максимальный ток через один выход которой составляет 0,5 А.

Хочу обратить внимание, что контакт Echo второго сенсора приходит на 13-й контакт Arduino, на котором находится светодиод самого контроллера.

Сделано это специально, для удобства, в тот момент, когда удовлетворяется условие «достаточно ли темно для начало опроса сенсоров?», светодиод на 13-ом контакте начинает мигать.

Плату рисовал в Sprint-Layout. Делал акцент на том, чтобы микросхемы и контроллер снимались, припаивал панельки SCS-14 и 16, а также гнездо на плату PBS 2×12 2.54. Единственный минус пришлось выгибать в другую сторону ножки микросхем 74НС595N.

При составлении скетча использовалась только одна библиотека Ultrasonic (для работы с сенсорами HC-SR04) и то можно было обойтись без неё. Пришлось повозиться с битовыми операциями, так как необходимо определенным образом загружать два байта в каскад сдвиговых регистров (в самом скетче сделал доходчивые пояснения).

Скетч

// ***Скетч подсветка лестницы V1*** // Библиотеки

#include “Ultrasonic.h”

// Пины #define Trig_1 10 // Устанавливаем контакты для первого датчика. #define Echo_1 11 #define Trig_2 12 // Устанавливаем контакты для второго датчика. #define Echo_2 13 #define Ds 8 // Ds/SDI первого сдвигового регистра 75HC595N_1. #define STcp 7 // STcp/RCLK сдвиговых регистров 75HC595_1, 2. #define SHcp 6 // SHcp/SRCLK сдвиговых регистров 75HC595_1, 2.

#define LDR A0 // Аналоговый сигнал с фоторезистора.

Ultrasonic Sensor_1(Trig_1, Echo_1); // Определяем первый датчик.
Ultrasonic Sensor_2(Trig_2, Echo_2); // Определяем второй датчик.

// Параметры const int Limit = 100; // Переменная для хранения предела сравнения с освещенностью. const float Min_Disrance = 50.0; /* Диапазон, при котором сработает сенсор

Ширина ступеньки 55 см.*/

boolean Up_Sensor_Started = false; // Переменная отражающая факт срабатывания верхнего сенсора.
boolean Down_Sensor_Started = false; // Переменная отражающая факт срабатывания нижнего сенсора.

const int Read_Delay = 50; // Переменная для хранения времени задержки опроса сенсоров.

unsigned int leds = 0; // Переменная для хранения передаваемых битов в регистры. const int N = 10; /* Переменная для хранения количества ступеней лестницы. Отсчет идет с нуля! Максимум выходов 14-ть 2 Сборки Дарлингтона.*/ const int T_Ladder = 3000; // Переменная для хранения времени включенной лестницы.

const int T_Stair = 500; // Переменная для хранения времени между включениями.

void setup() { pinMode(Ds, OUTPUT); pinMode(STcp, OUTPUT); pinMode(SHcp, OUTPUT); // Serial.begin(9600); // Инициализация последовательного порта на скорости 9600 бойд.

}

void loop() { int LDR_Value = analogRead(LDR); // Считываем значение с фоторезистора. // Serial.println(LDR_Value); // Проверяем уровень освещенности в пределах от 0 до 1023. if(LDR_Value < Limit) // Сравнение "Достаточно ли темно для подсветки?". { Down_Sensor(); // Вызов процедуры опроса нижнего сенсора.

if(Down_Sensor_Started) // Проверка факта срабатывания нижнего сенсора. // Если есть, выполняем действия… { Down_Sensor_Started = false; // Возвращение фактов срабатывания в исходное состояние. Up_Sensor_Started = false; Turing_Upward(); // Вызов процедуры включения лестницы снизу вверх. } else // Если нет факта срабатывания нижнего сенсора…

{ Up_Sensor(); // вызываем процедуру опроса верхнего сенсора… if(Up_Sensor_Started) // и проверяем факт его срабатывания. // Если есть, выполняем действия… { Down_Sensor_Started = false; // Возвращение фактов срабатывания в исходное состояние. Up_Sensor_Started = false; Turing_Downward(); // Вызов процедуры включения лестницы сверху вниз.

} } delay(Read_Delay); // Задержка чтения сенсоров. }

}

// Процедура опроса верхнего датчика void Up_Sensor() { if((Sensor_1.Ranging(CM) < Min_Disrance) && (Sensor_1.Ranging(CM) > 0)) // Если измеренное расстояние больше нуля, но меньше предела то… { Up_Sensor_Started = true; // Факт срабатывания верхнего сенсора. }

}

// Процедура опрос нижнего датчика void Down_Sensor() { if((Sensor_2.Ranging(CM) < Min_Disrance) && (Sensor_2.Ranging(CM) > 0)) // Если измеренное расстояние больше нуля, но меньше предела то… { Down_Sensor_Started = true; // Факт срабатывания нижнего сенсора. }

}

// Процедура загрузки битов в регистры void updateShiftRegister() { digitalWrite(STcp, LOW); // Подаем низкий сигнал для загрузки битов в регистры.

byte First = lowByte(leds); /* Разделяем наш байт на младший и старший, так как функция shiftOut за раз пропускает только 8 бит.*/ byte Second = highByte(leds); shiftOut(Ds, SHcp, MSBFIRST, Second); // Проталкиваем 1-й байт и читаем его слева направо.

shiftOut(Ds, SHcp, MSBFIRST, First); // Проталкиваем 2-й байт. digitalWrite(STcp, HIGH); // Сбрасываем на выходы полученные биты.

}

// Процедура включения подсветки снизу вверх void Turing_Upward() { for (int i = 0; i = 0; i–) { bitSet(leds, i); // Изменение всех N битов на состояние 1 (или HIGH).

updateShiftRegister(); // Включение подсветки загрузкой измененного байта. delay(T_Stair); // Задержка между включением ступеней. } delay(T_Ladder); // Задержка включенной лестницы. leds = 0; // Обнуление байта.

updateShiftRegister(); // Потушить подсветку. }

Теперь про монтаж, укладывать светодиодную ленту, конечно же, лучше в специально для неё созданный профиль, но стоимость его довольно высока. Я брал кабель канал 12×12, срезал раскаленным канцелярским ножом лишнее, получилось следующее.

Чтобы спрятать сенсоры HC-SR04, нашел для них по размеру коробку IEK 20 мм.

Монтаж щитка особого труда тоже не составил, так как на плате заранее задумывалось установка винтовых клеммников.

Получившийся проект удовлетворил все поставленные задачи, во время работы автоматики не было замечено каких-либо отказов, замечаний.

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

Контроллер Arduino Pro Mini Atmega 328 5 В 16 МГц 1
Ультразвуковой сенсор HC-SR04 2
Блок питания 12 В 8.3 А 100 Вт 1
Светодиодная лента 5050 SMD 5 м IP65 2
Микросхема 74НС595N 2
Микросхема ULN2003A 2
Гнездо на плату PBS 1×40 2.54 1
Провод МГШВ 0.75
Кабель ПУНП 2×2.5
Кабель телефонный ШТЛП-4 0,12×7
Однополюсный автоматический выключатель 1 А 1
Однополюсный автоматический выключатель 10 А 1
Фоторезистор Gl5516 1
Стабилизатор напряжения L7805CV 1
Конденсатор керамический 0,33 мкФ 1
Конденсатор керамический 0,1 мкФ 2
Резистор 10 кОм 1
Панелька для микросхемы SCS-14 2
Панелька для микросхемы SCS-16 2
Коробка распределительная IEK 20 мм 2
Клеммник винтовой двухконтактный 13
Стеклотексталит 95×105 мм
Текстолит
Клемма проходная SRK 12
Кабель канал 12×12×2000
Кабель канал 16×16×2000
Расходники (термоклей, клей Момент Кристалл, припой, канифоль, флюс ТАГС)
Крепежные элементы (болты, гайки, саморезы, дюбеля, хомуты)

Спасибо за уделённое внимание.

Источник: http://www.pvsm.ru/umny-j-dom/185284

Подсветка ступеней лестниц – ХОРС – светодиодная подсветка и освещение

Система автоматической подсветки ступеней лестниц Smart Stairway

Много веков назад лестница прочно вошли а обиход человечества. Архитекторы из поколения в поколение стараются придать лестницам изысканный вид и сделать их украшением любого здания.

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

Нас весьма часто просят реализовать столь не сложную функциональную задачу как освещение лестницы в темное время суток, но всегда эта задача становится незаурядной в связи с тем, что это освещение должно стать еще и декоративной изюминкой в освещении и дизайне. 

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

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

На протяжении последнего года наши дизайнеры и инженеры собирали все наработки нашей компании в области подсветки ступеней лестница для того, чтобы создать систему интерактивной автоматической подсветки ступеней лестницы, которая могла бы применяться практически в любом доме и на любой лестнице, которая могла бы настраиваться владельцем под любую конфигурацию, которую смог бы установить и настроить любой электрик с базовыми знаниями или любой  человек с основными знаниями электротехники. И вот наша компания готова предложить Вашему вниманию систему автоматической подсветки ступеней лестниц Smart Stairway!

Система подсветки лестниц Smart Stairway предназначена для освещения ступеней в темное время суток при помощи маломощных светодиодных источников света. Система построена по принципу гибко комплектуемого конструктора с открытым кодом программного обеспечения.

Задача наших инженеров была построить надежную и простую систему из качественных комплектующих при минимальных ценах. Поэтому за основу был взять прекрасно зарекомендовавший себя микроконтроллер компании Atmel (США)  ATMega 328 который и является сердцем системы.

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

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

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

Подробные характеристики, технический паспорт изделия и актуальные цены смотрите в нашем интернет-магазине:

Описание конструкции контроллера автоматической подсветки лестницы.

Контроллер выполнен в пластиковом корпусе который может быть установлен как на стену, так и на DIN-рейку. Размер корпуса контролера 115х90х41мм. К контролеру может быть подключено до 21 ступени, чего в большинстве случаев достаточно для освещения одного пролета лестницы даже при высоких потолках. К контроллеру могут бать подключены в случае необходимости :

  1.          –          до 4-х датчиков движения,
  2.          –          два проходных выключателя, обеспечивающих включение подсветки ступеней лестницы от выключателя в сторону движения человека к противоположной стороне лестницы.
  3.          –          фото сенсор, позволяющий использовать подсветку ступеней только в темное время суток.

Питание системы осуществляется от источника питания постоянного тока стабилизированного по напряжению от 5 до 12В.  Питание датчиков и напряжение подаваемое на выключатели 5В постоянного тока. Питание подсветки ступеней может бать от 5 до 12В постоянного тока в зависимости от используемого блока питания и типа источников света.

Если Вы используете светодиодные ленто, то для питания следует выбрать источник питания 12В, плюсовые выходы лент соединить вместе и подключить к соответствующему выходу контролера или источника питания.  Светодиодные ленто рекомендуется использовать SMD3528 с плотностью до 60 диодов на 1 метр. Такой ленты можно подключить до 1-го метра на 1 канал (на одну ступень) .

Мощность нагрузки одного канала не должна превышать 4,8Вт., или 0,4А..

            Фото сенсор следует устанавливать в месте обеспечивающим максимальную информативность об уровне освещения. Другими словами на него не должен попадать свет от источников света внутри помещения или от самой подсветки ступеней, т.к.

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

Алгоритм работы  контроллера.

            При использовании контроллера в режиме 4-х датчиков движения.

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

При обратном прохождении датчиков со стороны внутреннего контроллер аналогичным образом отрабатывает взведение таймера внутреннего датчика на 2 сек. и при прохождении наружного счетчик вычтет из количества людей на лестнице единицу.

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

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

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

При использовании контроллера в режиме 2-х датчиков движения.

            Если контроллер используется в режиме 2-х датчиков (задается в п.7 настроек), то алгоритм работы следующий. При срабатывании датчика движения включается подсветка в направлении движения человека. Т.е. от сработавшего датчика к противоположному.

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

5 меню настроек), после чего подсветка ступеней плавно выключится в том же порядке .

Использование датчика освещения.

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

Цифровой датчик подает на порт контроллера логический 0 когда освещение не достаточное или логическую единицу если уровень освещения меньше установленного предела. При недостаточном освещении активируется дежурная подсветка первой и последней ступеней и контроллеру разрешается включать подсветку ступеней по сигналам от датчиков движения в зависимости от установленного алгоритма (см.

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

Работа датчиков движения и обработка счетчиков людей на лестнице ведется даже тогда, когда подсветка по сигналу датчика освещенности не осуществляется.

Гарантийное обслуживание.

На систему светодиодной автоматической подсветки ступеней лестниц Smart Stairway наше предприятие предоставляет 12 месяцев  гарантии и 36 месяцев бесплатного сервисного обслуживания. В течении бесплатного сервисного обслуживания мы предоставляем  бесплатную диагностику, обновление прошивки контроллера до последней стабильной версии ПО,   и мелкий ремонт (не требующий замены комплектующих) .

Источник: http://xopc.net.ua/index.php/automatic-lights-stairs

До свидания, ATmega328! Здравствуй, ATmega328PB!

Журнал РАДИОЛОЦМАН, февраль 2016

Elliot Williams

Hackaday

В микроконтроллере (МК) нам всегда не хватает встроенной периферии. Будь то аппаратные каналы ШИМ, АЦП или последовательные интерфейсы обмена данными – в конечном итоге нам всегда хочется иметь хотя бы еще один из них, хотя на самом деле многие из них нам не нужны. Видимо, услышав наши мольбы, на смену популярному 8-разрядному МК ATmega328 [1] Atmel выпустила ATmega328PB [2].

К настоящему времени официального пресс-релиза по ATmega328PB Atmel так и не выпустила, как и не получил массового распространения по дистрибьюторским сетям сам микроконтроллер.

В начале 2015 года сообщалось о выходе приборов семейства megaAVR серии «PB» (ATmega168PB, ATmega88PB, ATmega48PB) и возможном релизе ATmega328PB, но если по первым уже имеются какие-то наработки и пользователи применяют их в своих устройствах и делятся впечатлениями, то ATmega328PB до сих пор остается загадкой.

Прежде всего, необходимо подчеркнуть, что ATmega328PB не является полной заменой ATmega328/ATmega328P, а представляет собой новое устройство, однако по выполняемым функциям он обратно совместим с существующим ATmega328.

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

Несмотря на то, что серия выпускается только в 32-выводных корпусах TQFP/QFN/MLF, по расположению выводов с ATmega328 она не совместима, о чем более подробно будет сказано ниже.

В статье мы не будем останавливаться на технических характеристиках, а постараемся раскрыть пользователям основные функциональные отличия ATmega328PB от своего предшественника.

Общие сведения

В высокопроизводительном 8-разрядном AVR RISC микроконтроллере ATmega328PB реализована технология управления питанием picoPower. Он имеет 32 КБ Flash-памяти с поддержкой чтения во время записи, 1 КБ EEPROM и 2 КБ ОЗУ.

Пользователю доступны 27 линий ввода/вывода общего назначения, 32 регистра общего назначения, пять таймеров/счетчиков с расширенным функционалом и гибкими настройками, внутренние и внешние прерывания, 8-канальный 10-разрядный АЦП, программируемый сторожевой таймер с отдельным генератором, последовательные интерфейсы USART, TWI и SPI.

МК сохраняет полную работоспособность в широком диапазоне напряжений питания от 1.8 В до 5.5 В. Оценить функциональный состав МК можно по блок-схеме на Рисунке 1.

Рисунок 1. Блок-схема микроконтроллера ATmega328PB.

Для поддержки разработчиков компания предлагает оценочный набор ATMEGA328PB-XMINI (серия Xplained Mini), который может использоваться не только для знакомства с возможностями микроконтроллера, но также для разработки и отладки собственных приложений. Выполненная в Arduino-совместимом форм-факторе оценочная плата упростит интеграцию ATmega328PB в пользовательские устройства.

Дополнительные порты ввода/вывода

В ATmega328PB добавлен дополнительный 4-битный порт ввода/вывода PORTE [3:0] (Таблица 1). Две линии ввода/вывода PE2 (вывод 19) и PE3 (вывод 22) мультиплексированы с входами АЦП ADC6 и ADC7.

Выводы 3 (GND в ATmega328) и 6 (VCC в ATmega328) заменены на линии ввода/вывода PE0 и PE1, соответственно, при этом PE0 выполняет альтернативную функцию выходного канала аналогового компаратора ACO.

Таблица 1. Функциональные отличия портовввода/вывода ATmega328PB
Выводы корпусаTQFP/MLF ATmega328 ATmega328PB
3 GND PE0/ACO
6 VCC PE1
19 ADC6 ADC6/PE2
22 ADC7 ADC7/PE3

ATmega328PB стал первым 8-разрядным МК семейства AVR с интегрированным контроллером сенсорного интерфейса QTouch (Peripheral Touch Controller, PTC), обрабатывающим сигналы емкостных сенсоров для определения касания.

Как правило, внешние емкостные сенсоры формируются на печатной плате, а их электроды подключаются непосредственно к аналоговому интерфейсу PTC посредством мультиплексирования линий ввода/вывода в микроконтроллере.

PTC поддерживает режимы работы как с определением собственной емкости сенсоров, так взаимной.

Первый режим обеспечивает возможность подключения к МК 24 сенсорных кнопок, второй – 144 кнопок.

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

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

Рисунок 2. Блок-схема контроллера QTouch в режиме определениясобственной емкости сенсоров.

Разработка и отладка сенсорного интерфейса для приложений на МК ATmega328PB поддерживается программной средой QTouch Composer с библиотекой QTouch Library, в которой можно создавать различные комбинации сенсорных кнопок, слайдеров, колес и датчиков приближения.

Механизм обнаружения сбоев синхронизации

Clock Failure Detection mechanism (CFD) – еще одно нововведение в ATmega328PB. Это схема цифровой логики с собственным генератором 128 кГц, предназначенная для отслеживания сбоев синхронизации (только для кварцевого резонатора и внешнего источника тактовой частоты) и автоматического переключения на встроенную схему RC-генератора 1 МГц.

Включение механизма контроля синхронизации выполняется автоматически на стадии программирования Fuse-битов выбора источника тактовой частоты (CKSEL) и активизируется только при тактовой частоте выше 256 кГц. При переходе микроконтроллера в режим пониженного энергопотребления схема контроля тактовой частоты отключается, и включается автоматически при пробуждении МК.

Два дополнительных таймера/счетчика

В ATmega328PB интегрированы два дополнительных 16-разрядных таймера/счетчика с отдельными предделителями, блоками сравнения и входами захвата. Таким образом, теперь ATmega328PB имеет два 8-разрядных и три 16-разрядных таймера/счетчика с расширенным набором функций. С добавлением этих таймеров число доступных каналов аппаратной ШИМ выросло до 10 (на ATmega328 их всего 6).

OCM1C2 – модулятор выходов таймеров

Встроенный модулятор Output Compare Modulator (OCM) позволяет генерировать модулированные сигналы.

Он использует выходы блоков сравнения (Output Compare Unit B) двух появившихся в ATmega328PB новых 16-разрядных таймеров/счетчиков Timer/Counter3 и Timer/Counter4, о которых было сказано выше.

Когда работа модулятора разрешена, два выхода каналов сравнения образуют модулятор, где один канал служит источником несущей частоты, а другой – модулирующей, как это показано на Рисунке 3.

Рисунок 3. Блок-схема модулятора выходов таймеров.

Выходы блоков сравнения Output Compare 3B и Output Compare 4B совместно используют один вывод порта PD2. Имея более высокий приоритет, выходы блоков сравнения (OC3B и OC4B) переопределяют конфигурацию вывода PD2, заданную битом PORTD2. Когда OC3B и OC4B разрешены одновременно, автоматически разрешается работа модулятора.

Дополнительные последовательные интерфейсы обмена данными

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

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

Детектор старт-бита имеет собственный тактовый генератор 8 МГц, поддерживает работу как в асинхронном, так и в синхронном режиме, и может быть сконфигурирован для генерации сигнала прерывания немедленно после определения старт-бита.

Аналоговый компаратор

Выход аналогового компаратора ACO подключен к отдельному выводу микроконтроллера, мультиплексируемому с портом PE0.

Уникальный серийный номер

Узнать уникальный серийный номер ATmega328PB можно посредством чтения определенных регистров ввода/вывода. Он формируется конкатенацией 9 байт, содержащихся в этих регистрах. Регистры доступны только для чтения.

Заключение

Увеличенное количество коммуникационных интерфейсов, 10 каналов ШИМ, контроль тактовой частоты и, самое главное, поддержка сенсорного интерфейса QTouch значительно расширяют область применения микроконтроллера ATmega328PB. Это могут быть промышленные системы контроля и управления, драйверы светодиодных светильников, приборы учета, средства домашней автоматизации. Дополнительная информация доступна в техническом описании.

Микроконтроллер ATmega328PB поддерживается основными программными, аппаратными и системными отладочными инструментами, включая Atmel Studio 6 и Atmel Power Debugger. Кроме того, множество примеров, программных библиотек и вспомогательных инструментов доступно пользователям в Atmel Gallery.

Ссылки

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

  1. Datasheet Atmel ATmega328
  2. Datasheet Atmel ATmega328PB

Источник: https://www.rlocman.ru/review/article.html?di=162667

Наручные часы на Atmega328 и OLED дисплее

Дата публикации: 14 ноября 2013.

Рейтинг:  5 / 5

Будильники– Активация до 10 будильников.- Количество будильников ограничено только количеством доступных EEPROM и RAM.

– У каждого будильника настраиваются часы, минуты и в какие дни недели он должен быть активным.

Игры

Побег АвтомобильDodge

Приложения

Фонарик. Включаетвсе пикселиOLEDисветодиоды, а также имеетрежимстробоскопа Стопкадр

Некоторые возможности:– 3 канала регулировки громкости для:Основного режима;Будильника;

Почасового сигнала.

– Режим ожидания- Регулировка яркости дисплея

– Анимация

Вы же не собираетесь, от этого отказываться, или может g shock купить спб ?

Энергосбережение

В активном режиме микроконтроллер пытается уйти в режим сна при каждой возможности.

В режиме сна контроллер просыпается на миллисекунду чтобы посмотреть нуждается устройство в обновлении, если нет, то он возвращается в режим сна, это обычно занимает менее 100 us, если дисплей не нуждается в обновлении. В этом режиме ток потребления может быть примерно от 0,8 мА до 2 мА, в зависимости от того, как долго высвечивается кадр.

В режиме сна микроконтроллер отключает OLED дисплей и уходит в спящий режим, где его разбудит только нажатие кнопки, сигнал от RTC или при подключении к USB. В этом состоянии микроконтроллер потребляет ничтожные 100 nА.

В спящем режиме общий ток потребления часов 6 uA. В активном режиме ток может варьироваться от 2 мА до более чем 70 мА, средний ток потребления 10 mA.

Общее потребление тока, емкость аккумулятора: 150mAh

Минимальный(В режиме сна) Нормальный(Индикация главных часов) Высокий(Фонарик)
6uA2.85 years 10mA15 hours 64mA2 hours, 20 minutes

Если часы находятся в активном режиме в среднем 1 минуту в день (с 5-секундный тайм-аутом сна и проверкой времени 12 раз в день), то они должны работать около 1 года 4 месяцев на одной зарядке. (30 дней, если часы просыпаются на 1 минуту в час).

Потребление тока для отдельных компонентов

Компонент Потребление тока
ATmega328P (сон/активный) 100nA / 1.5mA
OLED (сон/активный) 500nA / 8.5mA
DS3231M RTC 2.5uA
Диод Шоттки (D1) (ток обратной утечки) 1uA
Регулятор (ток покоя) 1uA
Другие (MOSFET и конденсаторы и т.п. утечки) 1uA
Всего (сон/активный) 6.1uA / 10mA

Дальнейшее совершенствование проекта– Программирование через USB. На данный момент используются 4 провода для SPI программирования, при частом подключении к разъему программирования, боюсь что он расшатается.- Добавить другой метод измерения заряда батареи.

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

Текущая прошивка использует примерно 28 KB из 32 KB свободного места памяти  ATmega328P, при использовании других микроконтроллеров с большим объемом памяти, необходимо будет добавить больше возможностей, например калькулятор.

Тем не менее, ATmega328P имеет самое большое количество памяти для AVR в 32 контактных TQFP корпусах, чтобы иметь больше памяти я должен был бы использовать 44 контактный AVR. ATmega1284 выглядит очень интересно.- Импульсный стабилизатор, регулятор подкачки заряда или может быть гибридное решение?

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

Может кто знает?

Фотогалерея проекта

Источник: https://radioparty.ru/device-avr/505-clock-atmega328-oled

Термометр на ATmega8 и датчике DS18B20

Доброго дня уважаемые друзья!
Приветствую Вас на сайте «Мир микроконтроллеров»

Схема термометра на ATmega8 и DS18B20
Микроконтроллер ATmega8
Цифровой термометр DS18B20
Семисегментный светодиодный индикатор
Алгоритм программы термометра
Программа цифрового термометра на DS18B20

Термометр по своим характеристикам очень прост, и его можно использовать только как термометр для измерения «комнатной» температуры. Использовать в этой конструкции микроконтроллер с памятью 8 килобайт конечно расточительно, можно применить микроконтроллер и попроще.

Но дело в том, что эта конструкция — основа для дальнейшего развития проекта с использованием цифрового датчика температуры DS18B20.

В следующей статье будет опубликована конструкция другого термометра — на двух датчиках DS18B20, что позволит измерять температуру не только в комнате, но и «за бортом». Естественно, будет добавлена возможность измерять и отрицательные температуру.

В дальнейшем в конструкцию будет добавлена функция термостата, часы, возможность работы с различными нагрузками, что позволит уже собрать несложную конструкцию — основу «умного дома». Ну а сегодня первая статья из этой серии.

Схема термометра на ATmega8 и датчике температуры DS18B20

Давайте посмотрим на схему термометра:

Как видите, схема очень проста, используется только необходимый минимум деталей.
В схеме, для индикации показаний, применен семисегментный трехразрядный светодиодный индикатор (описание и подключение семисегментных индикаторов к микроконтроллеру).

Напряжение питания конструкции — 5 вольт.

Если вы примените микроконтроллер с низковольтным питанием (линейка микроконтроллеров ATmega), то можно и понизить питающее напряжение конструкции, но в этом случае, возможно придется уменьшить номинал гасящих сопротивлений в сегментах индикатора. Приблизительно номиналы сопротивлений можно брать: — при питании 5 вольт — 200-300 Ом — при питании 2,7 — 3 вольта — 100-150 Ом

(здесь вы можете ознакомиться с расчетом гасящих сопротивлений для семисегментных индикаторов)

(здесь вы можете ознакомиться с маркировкой микроконтроллеров)
Транзисторы — любые, маломощные, структуры NPN.
Датчик температуры — DS18B20 (ознакомиться с датчиком температуры DS18B20)
Семисегментный индикатор — любой трехразрядный с общим катодом. Если вы захотите применить другие, с общим анодом, тогда придется заменить транзисторы на PNP и внести изменения в программу (заменить массив двоичных кодов для вывода цифр на индикатор). Я применил индикатор красного цвета свечения, и заодно, для следующей схемы, приготовил такой-же, но голубого цвета свечения.

Источник: https://microkontroller.ru/shemyi-konstruktsii-na-mikrokontrollerah/termometr-na-atmega8-i-datchike-ds18b20/

Контроллер комнатной подсветки на базе Arduino nano

Здравствуйте! После того, как c помощью arduino я намигался светодиодами, устал выводил “Hello World” на дисплей и крутить сервами, появилась мысль сделать нечто, что будет приносить хоть какую-то пользу. И, собственно, возжелал я автоматической подсветки в комнате.

Предупреждение: этот проект имеет скорее статус учебного, то есть цель — как можно сильнее выпендриться, а не экономить ресурсы.

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

Общее описание

На самом деле, как только я захотел подсветку, я взял кусок текстолита, грубо нарисовал на нём дорожки “методом квадратов” и напаял светодиоды с резисторами. Получилась ужасная на вид линейка светодиодов. В таком виде она светила около трех дней, после чего я подумал, что так жить нельзя.

Итак, были сформирован нехитрый список требований: 1) Модульность. Любая часть системы должна быть легко заменяема. 2) Аккуратный внешний вид.

Исходя их этих требований была придумана система, состоящая из двух основных компонентов:

  • контроллер (про себя я называю его “управляющий центр”), который содержит в себе трансформатор 220В->5В, логику, драйверы для светодиодных модулей.

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

Логика реализована на Arduino Nano.

Именно эта разновидность Arduino была выбрана потому, что она сочетает в себе малые габариты и удобство подключения кабеля для заливки прошивки.

Разумеется, для пущего эффекта, подсветка должна зажигаться и гаснуть плавно. Для этого я решил использовать . Как известно Arduino Nano имеет 6 выводов с ШИМ. Получается, контроллер будет иметь 6 разъёмов для подключения модулей.

В качестве драйвера светодиодов я выбрал микросхему ULN2003. Это транзисторная сборка, она имеет 7 выводов, каждый из которых может “протащить” ток до 0,5А.

Я использовал по одной микросхеме на 2 разъёма, спаяв выводы группами по 3 и 4 вывода. Итого, я получил 3 разъёма для подключения модулей подсветки, с максимальным током 1,5А и 3 вывода с током до 2А.

Для соединения модулей с управляющим центром я использовал USB разъёмы.

Подробности про светодиодные модули

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

Основной модуль несёт на себе: разъём для подключения датчика, разъём для подключения к управляющему центру, по которому подаётся питание для датчика (напрямую от БП) и питание для светодиодов (через транзистор). Всего мне требуется 5 контактов для подключения модуля к контроллеру.

Земля, питание, земля для светодиодов, 2 контакта для подключения датчика. Именно 2 контакта потому, что изначально я планировал использовать ультразвуковые дальномеры. Но они требуют усложнения кода для определения движущегося объекта, поэтому, я отказался от них в пользу PIR сенсоров.

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

Таким образом, для организации подсветки одной локации необходим один основной модуль и неограниченное количество (главное — влезть в ограничение по току) ведомых модулей, подключаемых цепочкой. Для визуалов схемы: Основной:Ведомый:

Подробности про центр управления

Сначала, я собрал на макетке всё это с одной платой Arduino Nano. Но неожиданно открыл для себя тот факт, что ШИМ работает не на магии, а на таймере. И этот самый таймер могут занимать сторонние библиотеки (в моём случае — библиотека для работы с пультом ДУ).

Ситуация при которой мне прихошлось выбирать — плавное зажигание светодиодов или управление с пульта мне не понравилась. Поэтому, я не долго думая, взял вторую плату. Одна платка у меня занимается включением модулей и отсчитывает время их свечения, другая — обрабатывает события с датчиков и внешние сигналы управления (ИК пульт ДУ и “локальные” кнопки).

Между собой платы общаются по I2C. Раз уж я привёл схему модуля, то озаботился “вычерчиванием” и контроллера тоже (картинка кликабельна):

Воплощение в железе

В качестве “носителя” я использовал макетную плату — текстолит с дырочками. БП взял из закромов. Лежал у меня крутой блок питания для светодиодных лент, купленный в китайском интернет магазине. Характеристики блока достойные — 5В, 7А. Из смастерил стойки, «впаянные» в решётчатый корпус БП.

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

Как всё это выглядит, видно на фотографии:

Центр управления

В качестве гнезд для Arduino использовал отрезки PBS-40 (сорокадырочная гребёнка «мама»). ULN2003 установлены в специальные кроватки. Разъём для подключения ИК приёмника выполнен из отрезка “гребёнки”. Я отрезал 4 пина и вытащил один из них — получился разъём с ключём.

О изготовлении ответной части разъёма можно почитать в конце статьи. Есть шесть 6мм кнопок. Каждая включает/выключает модуль, подключённый к соответствующему разъёму. Эти 6 кнопок подключены к . Одна 12 миллиметровая кнопка включает/выключает все модули сразу.

Разъём, по которому подаётся питание на плату так же выполнен в виде USB разъёма. Фотографии пустой платы и платы в состоянии боевой готовности:

Модули подсветки

Модули выполнены так-же на макетке. “Косое” расположение резисторов позволяет делать модули более узкими, но снижает плотность монтажа светодиодов. Впрочем, более плотно их сажать и не к чему.

Сейчас модуль “стандартной” длинны вмещает 14 светодиодов, чего вполне хватает для моих целей. Как не трудно догадаться — модуль может быть выполнен в любом виде.

Например, можно использовать отрезок 5В светодиодной ленты, а разъёмы смонтировать прямо на кабеле. Основной:Ведомый:

Изготовление разъёмов с ключём

Для изготовления разъёма необходима гребёнка, гребёнка-мама и кое-какие инструменты.Откусываем 4 штырька от “гребёнки”. Берём PBS-40, и отсчитываем 4 дырочки. На пятой кусаем кусачками. Именно на пятой потому, что гнездо, по которому проходит линия “надкуса”, разрушается.

По желанию, облагораживаем срез. Я для этого пользуюсь перочинным ножом.
Из обоих разъёмов второй справа (с любого права) контакт вытаскиваем чем-нибудь (например, теми же кусачками). Штырёк от гребёнки вставляем в освободившееся отверстие второй части разъёма.

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

Ответная часть разъёма с ключём готова. Можно припаивать провода и радоваться.

Прошивки

В архиве 2 скетча. Один для платы, работающей с датчиками и кнопками (master), второй для платы, работающей непосредственно с модулями (slave): .

В каждой прошивке есть структуры Joint. В выглядят они так: master:struct Joint { byte modul_num; //номер модуля (к какому пину подключён модуль знает только PWM контроллер) byte sens_type; //тип датчика (0 – цифровой, 1 – ультразвуковой дальномер) byte code; //Код датчика.

//Нужен для соотнесения описания с конкретным аналоговым датчиком byte sensor_pin; //вывод датчика (для цифровых) byte detect; //1, когда датчик сработал byte detect_old_state; byte event; //Что считать срабатыванием датчика (ноль или единица) unsigned long detect_delay; //задержка срабатывания unsigned long last_on_timestamp; //дата последнего срабатывания }; Joint joints[] = { //Модуль на письменном столе {0, 0, 0, //modul_num, sens_type, code 2, 0, 0, LOW, //sensor_pin, detect, detect_old_state, event 1000, 0 //detect_delay, last_on_timestamp }, //Модуль в тумбочке {1, 0, 0, //modul_num, sens_type, code 3, 0, 0, LOW, //sensor_pin, detect, detect_old_state, event 500, 0 //detect_delay, last_on_timestamp }, };slave:struct Joint { byte modulepin; //вывод для управления светодиодами byte pwm; //Значение ШИМ byte on; //0 – включить по таймеру. 1 – держать включённым, пока с датчика приходит “1” byte power; //0-не включать, 1- включить byte detect; //Состояние датчика byte fadeup; //Задержка при повышении яркости, микросекунды, настроечная byte fadedown; //Задержка при понижении яркости, микросекунды, настроечная byte OUTon; //Пришла команда не с датчика включить модуль unsigned long off_timeout; //задержка выключения (1000 – 1 секунда) unsigned long on_timestamp; //когда включен (для модулей, светящих по таймеру) }; Joint joints[] = { //Модуль на письменном столе {3, 0, 0, 0, //modulepin, pwm, on, power 0, 10, 10, 0, //detect, fadeup, fadedown, OUTon 120000, 0 //off_timeout, on_timestamp }, //Модуль в тумбочке {5, 0, 1, 0, //modulepin, pwm, on, power 0, 1, 5, 0, //detect, fadeup, fadedown, OUTon 120000, 0 //off_timeout, on_timestamp }, };Что есть что должно быть понятно из комментариев. Поясню некоторые моменты: master оперирует абстрактным «номером» модуля. События в ШИМ контроллер передаются в виде . А уже slave знает, как соотносить номер модуля с конкретным пином. В моём случае, номер пина в master — просто порядковый номер структуры, описанной в slave. В прошивке для master можно видеть «byte code; //Код датчика //Нужен для соотнесения описания с конкретным аналоговым датчиком» — это как раз использовалось для работы с УЗ дальномерами. Сейчас не убрано… на всякий случай. При подключении нового модуля, нужно просто описать ещё одну структуру в обеих прошивках.

Мастер

Идея прошивки мастера заключается в том, что бы циклично опрашивать датчики. Если обнаруживается изменение состояния датчика, инициируется передача события ведомому модулю. Каждые 5 секунд осуществляется синхронизация. Синхронизация была добавлена мной опять таки «на всякий случай».

Не разу такой ситуации не возникало, но она призвана избавить систему от ситуации, когда сообщение о изменении состояния датчика «потерялось». Во время синхронизации просто передаётся текущее состояние всех датчиков.

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

Если оно оказывается отличным от нуля, осуществляется передача на ведомый модуль сообщения о значении этой переменной.

Ведомый (ШИМ контроллер)

Скажу сразу — для плавного управления яркостью, используется delay во время изменения значения ШИМ. Я знаю, что это плохо и в планах стоит избавиться от этого.

Сейчас же, что бы не допустить запредельного увеличения задержки, при одновременно наличии нескольких загорающихся/затухающих модулей вычисляется среднее значение задержки для всех модулей некрасивой процедурой real_delay. При получении сообщения от мастера, вызывается процедура receiveEvent. Первым байтом передаётся тип сообщения.

Сообщения бывают двух типов: 0-передача состояния датчика и 1-внешняя команда. При получении нуля, ожидается ещё 2 байта: номер модуля и состояние датчика на модуле, после их получения, значения сохраняются в соответствующей структуре.

При получении сообщения типа «один», внешняя команда считывается сразу в переменную OUTcode, которая затем обрабатывается процедурой OUTcontrol, вызываемой из основного цикла. Если в качестве типа сообщения приходит не ноль и не единица (ну, помеха, например), выбираем всё сообщение до конца, что бы освободить буфер и не прозевать «настоящее» сообщение.

Финансовые затраты

Думаю, не красиво при публикации здесь, давать ссылки на сторонние магазины, но врать тоже не красиво. Поэтому, на то, что можно найти в местном магазине, даю ссылки на него. Остальное туда, где я реально заказывал детали. Для управляющей платы:

— 800р x2

— 10р x3
— 2р x3
— 100р
— 10р х2
— 2р
— 100р
— 160р
— 15р
— 30р х2
— 48 р
— 54 р
— 700 р Витая пара для соединительных кабелей — бесценно Для модуля:

— 70р х2

— 15 р + датчик на ваш вкус. Итого (контроллер): 2900 рублей.

Итого (модуль без датчика): 155 рублей.

Источник: http://robocraft.ru/blog/2910.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}