Ардуино для начинающих. урок 5. кнопки, шим, функции

Объяснение программы для ведомой (Slave) платы Arduino

1. Как и в ведущей плате, первым делом в программе мы должны подключить библиотеку Wire для задействования возможностей протокола I2C и библиотеку для работы с ЖК дисплеем. Также нам необходимо сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.

Arduino

#include<Wire.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 7, 8, 9, 10, 11);

1
2
3

#include<Wire.h>    
#include<LiquidCrystal.h>      

LiquidCrystallcd(2,7,8,9,10,11);

  1. В функции void setup():

—  мы инициализируем последовательную связь со скоростью 9600 бод/с;

Arduino

Serial.begin(9600);

1 Serial.begin(9600);

— далее мы инициализируем связь по протоколу I2C на контактах A4 и A5

В качестве адреса ведомого мы будем использовать значение 8 – очень важно здесь указать адрес ведомого;. Arduino

Wire.begin(8);

Arduino

Wire.begin(8);

1 Wire.begin(8);

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

Arduino

Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);

1
2

Wire.onReceive(receiveEvent);

Wire.onRequest(requestEvent);

— затем мы инициализируем ЖК дисплей для работы в режиме 16х2, отображаем на нем приветственное сообщение и очищаем его экран через 5 секунд.

Arduino

lcd.begin(16,2); //Initilize LCD display
lcd.setCursor(0,0); //Sets Cursor at first line of Display
lcd.print(«Circuit Digest»); //Prints CIRCUIT DIGEST in LCD
lcd.setCursor(0,1); //Sets Cursor at second line of Display
lcd.print(«I2C 2 ARDUINO»); //Prints I2C ARDUINO in LCD
delay(5000); //Delay for 5 seconds
lcd.clear(); //Clears LCD display

1
2
3
4
5
6
7

lcd.begin(16,2);//Initilize LCD display

lcd.setCursor(,);//Sets Cursor at first line of Display

lcd.print(«Circuit Digest»);//Prints CIRCUIT DIGEST in LCD

lcd.setCursor(,1);//Sets Cursor at second line of Display

lcd.print(«I2C 2 ARDUINO»);//Prints I2C ARDUINO in LCD

delay(5000);//Delay for 5 seconds

lcd.clear();//Clears LCD display

3. Затем нам будут необходимы две функции: одна для события запроса (request event) и одна для события приема (receive event).

Для события запроса:

Эта функция будет выполняться когда ведущий будет запрашивать значение от ведомого. Эта функция будет считывать значение с потенциометра, подключенного к ведомой плате Arduino, преобразовывать его в диапазон 0-127 и затем передавать его ведущей плате.

Arduino

void requestEvent()
{
int potvalue = analogRead(A0);
byte SlaveSend = map(potvalue,0,1023,0,127);
Wire.write(SlaveSend);
}

1
2
3
4
5
6

voidrequestEvent()

{

intpotvalue=analogRead(A0);

byteSlaveSend=map(potvalue,,1023,,127);

Wire.write(SlaveSend);

}

Для события приема:

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

Arduino

void receiveEvent (int howMany)
{
SlaveReceived = Wire.read();
}

1
2
3
4

voidreceiveEvent(inthowMany)

{

SlaveReceived=Wire.read();

}

4. В функции Void loop():

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

Arduino

void loop(void)
{
lcd.setCursor(0,0); //Sets Currsor at line one of LCD
lcd.print(«>> Slave <<«); //Prints >> Slave << at LCD
lcd.setCursor(0,1); //Sets Cursor at line two of LCD
lcd.print(«MasterVal:»); //Prints MasterVal: in LCD
lcd.print(SlaveReceived); //Prints SlaveReceived value in LCD received from Master
Serial.println(«Slave Received From Master:»); //Prints in Serial Monitor
Serial.println(SlaveReceived);
delay(500);
lcd.clear();
}

1
2
3
4
5
6
7
8
9
10
11
12

voidloop(void)

{

lcd.setCursor(,);//Sets Currsor at line one of LCD

lcd.print(«>>  Slave  <<«);//Prints >> Slave << at LCD

lcd.setCursor(,1);//Sets Cursor at line two of LCD

lcd.print(«MasterVal:»);//Prints MasterVal: in LCD

lcd.print(SlaveReceived);//Prints SlaveReceived value in LCD received from Master

Serial.println(«Slave Received From Master:»);//Prints in Serial Monitor

Serial.println(SlaveReceived);

delay(500);

lcd.clear();

}

После того как вы соберете всю схему проекта и загрузите обе программы в платы Arduino вы можете приступать к тестированию работы проекта. Вращая потенциометр на одной стороне вы должны увидеть изменяющиеся значения на экране ЖК дисплея на другой стороне.

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

АЦП

ADC пины (с АЦП) помечены на плате буквой A. Да, пины A6 и A7 на плате Нано имеют только вход на АЦП и не являются GPIO пинами! АЦП – аналогово-цифровой преобразователь, позволяет измерять напряжение от 0 до VCC (напряжения питания МК) или опорного напряжения. На большинстве плат Ардуино разрядность АЦП составляет 10 бит (2^10 = 1024), что означает следующее: напряжение от 0 до опорного преобразуется в цифровую величину от 0 до 1023 (1024-1 так как отсчёт идёт с нуля). Опорное напряжение играет очень большую роль: при опорных 5V один шаг измерения АЦП составит 4.9 милливольта (0.00488 В), а при опорных 1.1В – 1.1 мВ (0.00107 В). Вся суть в точности, я думаю вы поняли. Если опорное напряжение установлено ниже напряжения питания МК, то оцифровывая напряжение выше опорного мы получим 1023. Подавая на АЦП напряжение выше 5.5 Вольт получим выгоревший порт. Подавать отрицательное напряжение также не рекомендуется. На ардуино есть несколько режимов опорного напряжения: оно может быть равно VCC (напряжению питания), 1.1V (от встроенного в МК стабилизатора) или получать значение с внешнего источника в пин Aref, таким образом можно настроить нужный диапазон и получить нужную точность. У других моделей Ардуино (например у Меги) есть и другие встроенные режимы. Опорное напряжение рекомендуется заводить на плату через резистор, например на 1 кОм. Для измерения напряжений выше 5.5 вольт необходимо использовать делитель напряжения на резисторах.

Функции

В данной статье мы будем использовать следующие связанные с цифровыми сигналами функции Arduino:

Поскольку цифровые I/O выводы Arduino могут использоваться в качестве и входа, и выхода, вы должны сначала настроить выводы, которые вы собираетесь использовать для цифрового ввода/вывода, с помощью данной функции. – это номер вывода, который вы хотите настроить. Режим, , может принимать одно из трех значений: , или . Когда устанавливается в значение , к выводу подключается внутренний подтягивающий резистор 20 кОм, чтобы привести уровень на выводе к значению HIGH, если к нему ничего не подключено.
Данная функция записывает цифровое значение в вывод. задает, в какой вывод на плате Arduino будет записано цифровое значение, а – это цифровое значение, в которое будет установлен вывод. может принимать только значения и .
Данная функция считывает цифровое значение из вывода. – это номер цифрового I/O вывода, который вы собираетесь прочитать. Данная функция возвращает одной из двух значений: или

Как сделать двунаправленное подключение 3,3В и 5В?

К примеру, сигналы шины I2C могут передаваться в обоих направлениях. Это затрудняет дело с согласованием сигнала для обоих стандартов и требует более сложной схемы.

Схема состоит из MOSFET транзистора (BSS138) N-типа со встроенным диодом и 2 резисторов сопротивлением по 10 кОм.

D2 — это устройство с сигналом стандарта 3,3В, а D1 — это устройство с сигналом стандарта 5В.

Рассмотрим работу схемы:

Первый вариант – D2 отправляет сигнал, D1 принимает его. Когда на выходе D2 есть лог. 1, MOSFET закрыт, и вход D1 с помощью сопротивления R1 подтянут к плюсу источника питания. Когда на выходе D2 есть лог. 0, MOSFET открыт, и вход D1 соединяется с минусом питания.

Второй вариант – D1 отправляет сигнал, D2 принимает его. Когда на выходе D1 есть лог. 1, MOSFET закрыт, и вход D2 с помощью сопротивления R2 подтянут к плюсу источника питания. Когда на выходе D1 есть лог. 0, через имеющийся в MOSFET транзисторе диод начинает протекать ток и напряжение истока уменьшается относительно затвора. MOSFET открывается, и вход D2 соединяется с минусом питания.

Паяльный фен YIHUA 8858
Обновленная версия, мощность: 600 Вт, расход воздуха: 240 л/час…

Подробнее

По производителю

Существуют как официальные версии плат Arduino, так и платы от сторонних производителей. Оригинальные платы отличаются высоким качеством продукта, но и цена тоже выше. Они производятся только в Италии и США, о чём свидетельствует надпись на самой плате.

На примере самой популярной платы Arduino UNO:

  • Оригинальная плата. Поставляется только в фирменной коробке, имеет логотип компании, на портах платы — маркировка. Цена от производителя 20 €.

  • Плата от стороннего производителя. Качество хуже, однако цена начинается от 150 рублей. Качество платы может отразиться на её работоспособности в дальнейшем. Хоть это и редкость, но плата и вовсе может не работать «из коробки» — всё зависит от добросовестности изготовителя и продавца. Для работы с подобными платами требуется драйвер CH340, который находится в свободном доступе. Во всём остальном процесс разработки идентичен процессу разработки на оригинальных платах.

Интерфейсы

Большинство GPIO имеют дополнительные возможности, так как к ним подключены выводы с других систем микроконтроллера, с ними вы уже знакомы из предыдущего урока:

  • ADC (АЦП, аналогово-цифровой преобразователь) – зелёные подписи ADC* на распиновке
  • UART (интерфейс связи) – голубые TXD и RXD на распиновке
  • Выводы таймеров, они же ШИМ пины – светло-фиолетовые OC*A и OC*B, где * номер таймера
  • SPI (интерфейс связи) – голубые SS, MOSI, MISO, SCK
  • I2C (интерфейс связи) – голубые SDA и SCL
  • INT (аппаратные прерывания) – розовые INT0 и INT1, а также PCINT* – PinChangeInterrupt

Если про интерфейсы мы уже говорили, то АЦП, прерывания и выводы таймеров ещё не затрагивали.

Таймеры (ШИМ)

Выводы таймеров: в микроконтроллере, помимо обычного вычислительного ядра, с которым мы работаем, находятся также “хардварные” счётчики, работающие параллельно со всем остальным железом. Эти счётчики также называют таймерами, хотя к таймерам они не имеют никакого отношения: счётчики буквально считают количество тиков, которые делает кварцевый генератор, задающий частоту работы для всей системы. Зная частоту генератора (обычно 16 МГц) можно с очень высокой точностью определять интервалы времени и делать что-то на этой основе. Какой нам прок от этих счётчиков? “Из коробки” под названием Arduino IDE мы имеем несколько готовых, основанных на таймерах инструментов (функции времени, задержек, измерения длин импульсов и другие).

В этой статье речь идёт о пинах и выходах, о них и поговорим: у каждого счётчика есть два выхода на GPIO. У нано (у МК ATmega328p) три счётчика, соответственно 6 выходов. Одной из возможностей счётчиков является генерация ШИМ сигнала, который и выводится на соответствующие GPIO. Для нано это D пины 5 и 6 (счётчик 0), 9 и 10 (таймер 1) и 3 и 11 (таймер 2). ШИМ сигналу посвящен отдельный урок, сейчас просто запомним, что с его помощью можно управлять яркостью светодиодов, скоростью вращения моторчиков, мощностью нагрева спиралей и многим другим. Но нужно помнить, что ограничение по току в 40 мА никуда не делось и питать от пинов ничего мощнее светодиодов нельзя.

Что такое Arduino?

Arduino – это семейство электронных платформ, предназначенных для изучения проектирования электроники.

Arduino NANO – компактная платформа для прототипирования микроэлектронных устройств, предназначенная для использования с макетной платой. Функционал устройства во многом схож с Arduino UNO и отличается от нее лишь размерами платы и отсутствием отдельного разъема для питания.

Основа Arduino Nano – микроконтроллер на базе ATmega328, логическая микросхема для обработки данных с тактовой частотой 16 МГц, имеющая на борту 8 аналоговых и 14 цифровых контактов общего назначения, а также все необходимые интерфейсы: I2C, SPI и UART.

Интерфейсы подключения

У микроконтроллерной платформы Arduino существует два типа интерфейсов входов/выходов(I/O ports) — аналоговые и цифровые порты, так же называемые пинами. Эти пины настраиваются как входы или как выходы, чтобы, соответственно, считывать информацию в виде электрического напряжения или передавать её в виде напряжения на определенный источник.

Цифровые порты

Цифровые порты 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 позволяют подключить к Arduino различные датчики, сенсоры и прочие микросхемы. Цифровой порт имеет всего два значения для приёма/передачи: HIGH(высокий) и LOW(низкий). Они же соответственно 5V и 0V.

Аналоговые порты

Arduino Uno имеет на своей плате шесть аналоговых портов A0, A1, A2, A3, A4, A5. Аналоговые порты нужны для того, чтобы регулировать напряжение на порте от 0 до 5V. Диапазон их значений, доступных для приёма и передачи лежит в отрезке от 0 до 1023, где 0 соответствует 0V, а 1023 — 5V.

Пример перевода аналогового сигнала в вольты:

 float Step = 5.0F  1024; // Вычисляем шаг Uопорн / на градацию 
  
 void setup() 
 { 
 Serial.begin(9600); // Задаем скорость работы монитор порта 
 } 
 
 void loop() 
 { 
 int analogValue = analogRead(); // Задаем переменную analogValue для считывания показаний 
 float voltageValue = analogValue * Step; // Переводим в вольты (показание * шаг) 
 Serial.println(voltageValue); // Выводим значение в вольтах в порт 
 delay(500); // Ждем пол секунды//

Пины коммуникации на плате Arduino

Назначение пинов SDA, SCL Arduino

Данные пины используются для приема/передачи информации по протоколу I2C. Например, при подключении жк дисплея с модулем I2C или GPS модуля. С помощью специальной библиотеки микроконтроллер может обмениваться информацией с подключенным периферийным устройством, поддерживающим данный протокол. На Ардуино Мега, в отличии от Уно и Нано, имеется целых три пары пинов SDA, SCL.

Назначение пинов TX, RX Arduino

Пины TX/RX также используются для коммуникации, но уже по протоколу UART. На платах Уно и Нано пины TX/RX подключены параллельно USB разъему для связи с компьютером. Поэтому, если вы подключите к данным портам устройство, например, блютуз модуль, то вы не сможете загрузить в Ардуино скетч, так как плата автоматически переключается на чтение данных с устройства, а не с компьютера.

Подключение Arduino Nano

Подключение платы Arduino Nano к компьютеру не представляет особого труда – оно аналогично обычной плате Uno. Единственная сложность может возникнуть при работе с платой на базе чипа ATMEGA 168 – в настройках нужно выбрать сперва плату Nano, а затем нужный вариант процессора.

Установка драйвера для CH340

Микросхема CH340 часто используется в платах Ардуино со встроенным USB-to-Serial преобразователем. Она позволяет уменьшить затраты на производство плат, не влияя на ее работоспособность. При  помощи этого программатора можно легко прошивать платы Ардуино. Для того, чтобы начать работать с этой микросхемой, нужно установить драйвер на компьютер.

Установка выполняется в несколько этапов:

Настройка Arduino IDE

Стандартная среда разработки Arduino IDE используется для работы всех видов Ардуино с компьютером. Чтобы начать работу, нужно сначала скачать Arduino IDE с официального сайта и установить ее. Удобнее скачивать Windows Installer, особенно если среда разработки будет установлена на постоянном рабочем компьютере. Если скачан архив, то его нужно распаковать и запустить файл Arduino.exe.

Как только среда установлена, нужно ее запустить. Для этого нужно подключить к компьютеру саму плату Ардуино через USB. Затем перейти в меню Пуск >> Панель управления >> Диспетчер устройств, найти там Порты COM и LPT. В списке появится установленная плата и указан номер порта, к которому подключается плата.

После этого нужно запустить Arduino IDE, перейти в меню Инструменты >> Порт, и указать порт, к которому присоединена Ардуино.  В меня Инструменты>> Платы нужно выбрать модель подключенной платы, в данном случае Arduino Nano. Если у вас плата Nano версии 2.0, то вам нужно также выбрать вариант процессора в соответствующем меню.

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

Аналоговые, цифровые и шим пины Ардуино

Для этого занятия потребуется:

Arduino Uno / Arduino Nano / Arduino Mega

Все пины можно разделить на несколько видов, различие будет только в количестве данных выводов на различных платах. Например, на Arduino Mega 2560 цифровых и аналоговых портов, значительно больше, чем на Uno или Nano из-за большего размера платы и производительности микроконтроллера. В остальном характеристики и способы программирования пинов не отличаются друг от друга.

  1. Power Pins — порты питания, режим их работы нельзя запрограммировать или изменить. Они выдают стабилизированное напряжение 5V или 3,3V, Vin выдает напряжение от источника питания, а GND — это заземление (общий минус);
  2. PWM Pins — порты с ШИМ модуляцией, которые можно запрограммировать, как цифровой выход/вход. Данные порты обозначены на плате знаком тильда (˜);
  3. Analog In — порты, принимающие аналоговый сигнал от датчиков, работают на вход. Данные порты тоже можно запрограммировать, как цифровой вход/выход. Данные пины не поддерживают ШИМ модуляцию.

Режим пинов назначается в процедуре void setup с помощью pinMode(), например:

void setup() {
    pinMode(10, OUTPUT); // объявляем пин 10 как выход
    pinMode(A2, OUTPUT); // объявляем пин A2 как выход

    pinMode(12, INPUT); // объявляем пин 12 как вход
    pinMode(A1, INPUT); // объявляем пин A1 как вход
}

Пояснения к коду:

  1. к выходу 10 и A2 можно подключить светодиод, который будет включаться и выключаться при вызове команды в программе;
  2. пин 10 может использоваться для ШИМ сигнала, например, чтобы плавно включить светодиод, а пин A2 может выдавать только цифровой сигнал (0 или 1);
  3. к входу 12 и A1 можно подключить цифровой датчик и микроконтроллер будет проверять наличие сигнала на этих пинах (логический нуль или единицу);
  4. к входу A1 можно подключить аналоговый датчик тогда микроконтроллер будет получать не только сигнал но и узнавать характеристику сигнала.

Мы не случайно разделили пины с ШИМ модуляцией (PWM Pins) и аналоговые. PWM пины создают аналоговый сигнал, к ним подключают сервопривод, шаговый двигатель и другие устройства, где требуется подавать сигнал с разными характеристиками. Аналоговые пины (Analog In) используются для подключения аналоговых датчиков, с них входящий сигнал преобразуется в цифровой с помощью встроенного АЦП.

Ардуино Uno пины: шим, аналоговые, цифровые


Arduino UNO распиновка платы на русском

ШИМ (PWM) порты
(Analog Out)
3, 5, 6, 9, 10, 11
Аналоговые порты
(Analog In)
A0, A1, A2, A3, A4, A5
на некоторых платах: A6, A7
Цифровые порты
(Digital In/Out)
все порты со 2 по 13 пин
можно использовать: A0 — A7

Из таблицы видно, какие пины на Arduino UNO поддерживают шим. Аналоговые пины (Analog In) используют, как цифровые если недостаточно портов общего назначения, например, вы хотите подключить к плате 15 светодиодов. Кроме того, на плате Arduino Uno и Nano порты A4 и A5 используются для I2C протокола (SDA и SCL пины) — они работают параллельно с пинами A4 и A5. Об этом мы расскажем чуть позже.

Ардуино Nano пины: шим, аналоговые, цифровые


Arduino Nano распиновка платы на русском

ШИМ (PWM) порты
(Analog Out)
3, 5, 6, 9, 10, 11
Аналоговые порты
(Analog In)
A0, A1, A2, A3, A4, A5
на некоторых платах: A6, A7
Цифровые порты
(Digital In/Out)
все порты со 2 по 13 пин
можно использовать: A0 — A7

Если вы заметили, то пины на Arduino Nano и Uno имеют одинаковое количество и назначение. Платы отличаются лишь своими габаритами. Nano — более компактная и удобная плата, для экономии места на нее не ставят разъем питания, для этого используются пины Vin и GND на которое подается питание от источника.

Ардуино Mega пины: шим, аналоговые, цифровые


Схема распиновки платы Arduino Mega 2560 r3

ШИМ (PWM) порты
(Analog Out)
все порты со 2 по 13 пин
дополнительно: 44, 45, 46 пин
Аналоговые порты
(Analog In)
с A0 до A15
Цифровые порты
(Digital In/Out)
все порты со 2 по 13, со 22 по 52 пин
можно использовать: A0 — A15

Пины коммуникации нежелательно использовать, как обычные цифровые порты. Особенно при таком количестве портов общего назначения, как на Mega 2560. Более подробную информацию о рассмотренных платах, а также о других микроконтроллерах семейства Arduino (Pro Mini, Leonardo, Due и пр.): характеристики, описание пинов, габариты и т.д. можно узнать в разделе Микроконтроллеры на нашем сайте.

Что можно и чего нельзя

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

Вот какие ограничения это на нас накладывает.

Нет настоящей многозадачности. Можно симулировать многозадачность с помощью приёма Protothreading, но это скорее костыль. Нельзя, например, сказать: «Когда нажмётся такая-то кнопка — сделай так». Вместо этого придётся в основном цикле писать проверку: «А эта кнопка нажата? Если да, то…»

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

Аналогично с сетью: без дополнительных плат и библиотек Ардуино не может ни с чем общаться (кроме как включать-выключать электричество на своих выходах).

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

Отчёты? Ошибки? Только при компиляции. У Ардуино нет встроенных средств сообщить вам, что ему нехорошо. Если он завис, он не покажет окно ошибки: во-первых, у него нет графического интерфейса, во-вторых — экрана. Если хотите систему ошибок или отчётность, пишите её

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

Как установить библиотеку Ардуино ADS1220 модуля

Для ADS1220 не так уж много вариантов и самый доступный — библиотека от Protocentral. Она доступна из меню Скетч -> Подключить библиотеку -> Управление библиотеками, ввести в поиск ADS1220 и выбрать ProtoСentral ADS1220 24-bit ADS Library. Последнюю на данный момент версию 1.1.2 можно получить на GitHub Забегая вперед, надо отметить, что она (версия 1.1.2) видимо написана в спешке и не лишена ошибок. Однако, это все же лучше, чем ничего и надеюсь данная информация дойдет до сотрудников ProtoСentral и библиотеку исправят.Кстати, известна еще одна Ардуино библиотека для ADS1220. Работа с ней несколько сложнее, чем с версией от Protocentral и взглянув на её исходный код, заметил наличие тех же недочетов, хоть и в меньшей мере.Но вначале нужно определить последовательность использования библиотеки.

Выносим в отдельный поток

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

Немного подумав, я решил, что лучше сделать целый класс — движок работы с термодатчиками, унаследовав его от класса process<>, чтобы все собрать в одну кучку: сделать имплементацию функции-потока, дать этой функции доступ к членам класса, выставить наружу основные функции работы с термодатчиками.

Однако тут я уткнулся в жадность. Мне хотелось оставить возможность опроса термодатчиков из консоли и иметь сигнализацию. Сразу же возникает необходимость разделять общие ресурсы, так как теперь два потока будут дергать один термодатчик (а точнее, шину 1-Wire). Лезь в класс OneWire и добавляй ему приватного мембера .

Здесь начинается интересное. Мьютекс мы завели, но пользоваться им внутри класса неразумно, так как библиотека работы с термодатчиком написана очень сильно интегрировано и на лету дергает функции байтовой, а не пакетной приема-передачи по 1-Wire. Для локализации массовых вызовов я создал два метода: и для шины 1-Wire.

Затем пришлось прошерстить всю библиотеку DallasTemperature и обернуть вызовы функций работы с шиной 1-Wire в оболочку -> .

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

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

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

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

Остается лишь добавить в поток обработки аварийных сообщений кейсы нового источника аварий.

Элементы платы

Arduino Nano состоит из множества элементов, в числе которых:

  • микросхемы;
  • пассивные элементы (резисторы, конденсаторы, диоды);
  • разъемы;
  • регуляторы.

Микросхема платы FT232R

Микросхема позволяет подключать плату через USB. Чип, установленный в AN, не может работать напрямую с USB-интерфейсом, поэтому FT232R преобразует его в UART-интерфейс.

Сердце платформы — микроконтроллер ATmega328P

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

Светодиодная индикация

В плату встроено 4 светодиода, у каждого из которых свое назначение:

  1. RX- и TX-светодиоды мигают, когда происходит передача данных по UART.
  2. L-диод зажигается, когда на него подается высокий уровень сигнала, и гасится при низком уровне.
  3. ON-светодиод горит при наличии питания на плате.

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

Разъем mini-USB

С помощью разъема mini-USB плату можно подключить к персональному компьютеру. Также AN может получать через этот интерфейс питание от внешних источников.

Линейный понижающий регулятор напряжения 5 В

В качестве регулятора используется микросхема LM1117MPX-5.0. Она обеспечивает преобразование сигнала питания AN в сигнал питания микроконтроллера ATmega и других логических элементов, которые не поддерживают питание более 5 В. Например, элементы транзисторно-транзисторной логики (ТТЛ) запитываются от сигнала такой величины.

Интеграция с Arduino

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

  1. Откройте Arduino IDE
  2. Зайдите в меню Sketch.
  3. Затем включить библиотеку
  4. Управление библиотеками
  5. В поисковике вы можете искать Adafruit ADS1X15
  6. Нажмите на Установить

Теперь вы готовы начать, вы можете получить доступ к коду установленной библиотеки или доступные примеры в:

  1. Откройте Arduino IDE
  2. Перейти к файлу
  3. примеров
  4. И в списке ищите те, что находятся в этой библиотеке …

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Семинар по технике
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: