Автомобильный вольтметр на arduino

Содержание

Исходный код программы

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

Сначала в программе нам необходимо подключить все используемые библиотеки (в нашем случае мы будем использовать только одну библиотеку – для работы с ЖК дисплеем). Затем мы будем считывать значения напряжения в двух точках с помощью функции analogread.

Arduino

int voltage_value0 = analogRead(A0);
int voltage_value1 = analogRead(A1);

1
2

intvoltage_value0=analogRead(A0);

intvoltage_value1=analogRead(A1);

Затем мы объявим временную переменную (value), в которой будем хранить разницу значений voltage_value0 и voltage_value1. Затем значение этой переменной мы будем умножать на 0.00488 чтобы получить действительную величину падения напряжения на резисторе, а затем получившуюся величину мы будем делить на 22 (сопротивление) чтобы получить значение силы тока.

Arduino

int subraction_value =(voltage_value0 — voltage_value1) ;
float temp_val = (subraction_value*0.00488);
float current_value = (temp_val/22);

1
2
3

intsubraction_value=(voltage_value0-voltage_value1);

floattemp_val=(subraction_value*0.00488);

floatcurrent_value=(temp_val22);

Далее представлен полный текст программы.

Arduino

#include<LiquidCrystal.h> // библиотека для работы с ЖК дисплеем
LiquidCrystal lcd (7,8,9,10,11,12); // контакты платы Arduino, к которым подключен ЖК дисплей

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lcd.begin(16,2);
lcd.clear();
}

void loop() {
// put your main code here, to run repeatedly:
int voltage_value0 = analogRead(A0);
int voltage_value1 = analogRead(A1);

int subraction_value =(voltage_value0 — voltage_value1) ;
float temp_val = (subraction_value*0.00488);

float current_value = (temp_val/22);
Serial.print(current_value);
lcd.setCursor(0,0);
lcd.print(«current value=»);
lcd.setCursor(0,1);
lcd.print (current_value); // выводим измеренное значение тока на экран ЖК дисплея
lcd.print(«A»);
delay(1000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#include<LiquidCrystal.h> // библиотека для работы с ЖК дисплеем

LiquidCrystallcd(7,8,9,10,11,12);// контакты платы Arduino, к которым подключен ЖК дисплей

voidsetup(){

// put your setup code here, to run once:

Serial.begin(9600);

lcd.begin(16,2);

lcd.clear();

}

voidloop(){

// put your main code here, to run repeatedly:

intvoltage_value0=analogRead(A0);

intvoltage_value1=analogRead(A1);

intsubraction_value=(voltage_value0-voltage_value1);

floattemp_val=(subraction_value*0.00488);

floatcurrent_value=(temp_val22);

Serial.print(current_value);

lcd.setCursor(,);

lcd.print(«current value=»);

lcd.setCursor(,1);

lcd.print(current_value);// выводим измеренное значение тока на экран ЖК дисплея

lcd.print(«A»);

delay(1000);

}

Как сделать двунаправленное подключение 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 соединяется с минусом питания.

Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров…

Подробнее

Основы цветовой маркировки резисторов

Для определения сопротивления резисторов используется следующая формула:

R= { (AB*10c)Ω ± T% }

где
A – значение цвета в первой полоске,
B – значение цвета во второй полоске,
C – значение цвета в третьей полоске,
T – значение цвета в четвертой полоске.

В следующей таблице представлены цветовые коды резисторов.

Цвет Числовое значение цвета Множитель (10c) Допуск
черный 10
коричневый 1 101 ± 1%
красный 2 102 ± 2%
оранжевый 3 103
желтый 4 104
зеленый 5 105
синий 6 106
фиолетовый 7 107
серый 8 108
белый 9 109
золотой 10-1 ± 5%
серебряный 10-2 ± 10%
нет полоски ± 20%

К примеру, если цветовые коды на резисторе Brown – Green – Red – Silver (коричневый – зеленый – красный – серебро), сопротивление резистора рассчитывается следующим образом:

Исходя из приведенной формулы для расчета сопротивления резистора R = AB*10c получаем:

Четвертая полоска показывает допуск резистора, в нашем случае это ± 10%.

То есть актуальное сопротивление данного резистора будет лежать в диапазоне от 1350 до 1650 Ом.

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

Настройка

В основном, требования к запуску проекта «вольтметр на Arduino» на независимой печатной плате – это источник питания 5 В, 16-мегагерцовый кварцевый генератор и, конечно же, связанные выводы микроконтроллера со всеми цифровыми и аналоговыми портами платы Arduino. Диаграмма ниже популярна в Интернете и объясняет, как нужно использовать схему для работы в качестве прототипа.

Новые компоненты, которые необходимо добавить в прототип для работы на печатной плате:

  • 1 28-контактный паяльник для пайки (для микроконтроллера Atmega);
  • 1 разъем питания для печатной платы;
  • 1 регулятор LM78L05;
  • 1 1uf конденсатор;
  • 1 конденсатор 10футов;
  • 1 кварцевый генератор 16 МГц;

С новыми компонентами и выводом микроконтроллера имеем следующую схему проекта «Ардуино-вольтметр»:

Еще на просторах Интернета можно найти такую схему вольтметра:

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

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

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

Определение

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

Основные правила принципиальных схем

  1. На принципиальной схеме соединение двух компонентов проводником обозначается прямой линией, соединяющей эти элементы.
  2. На каждый принципиальной схеме должен быть указан Источник питания (+) и земля (-).
  3. Каждый радиоэлемент обладает своим уникальным символом-пиктограммой.Если радиоэлементов одного рода в схеме несколько, им присваивается имя состоящее из буквы и цифры, где буква — первая буква названия радиоэлемента, а цифра — номер радиоэлемента в схеме.

Перечень основных радиоэлементов

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

Многие резисторы имеют маленькие размеры из за этого, для удобства их стали маркировать.Основными номиналами для резисторов стали 220 Ом, 1 кОм, 10 кОм.

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

Светодиод — это диод, который при пропуске тока, излучает свет. 

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

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

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

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

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

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

Как повысить точность измерения

Для повышения точности созданного устройства потребуется провести эксперимент. Первое значение получаем от вольтметра на Ардуино с выводом на ПК, вторую – с помощью необходимой функции. Поменяем константу (1.1 * 1023.0 * 1000) на усовершенствованную:

Первый множитель означает – 1.1 * Vcc1 (с вольтметром) / Vcc2 (с нашей функцией).

В итоге получаем погрешность. Затем, путем подсчета, выходим на настоящие значение напряжения в электрической сети. Предел измерений показаний на Ардуино устройства варьируется между 0 и 50 Вольтами.

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

Список необходимых компонентов:

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

после загрузки скетча у нас на дисплее отобразятся часы как на фото

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

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

и еще закомментируем строки

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

теперь изменим отображения месяца, добавив в скетч строки

Теперь наши часики будут выглядеть как на фото.

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

Ну а теперь, еще более усовершенствуем наши OLED часы и добавим к ним отображение температуры, которую мы будем считывать с датчика температуры DS18B20.

Для отображения рисунка с градусником на OLED дисплее и значка градуса выберем картинку с рисунком градусника и с помощью графического редактора сохраним ее в формате GIF с именем term.gif, и тоже самое проделаем с картинкой с значком градуса — сохраним ее как grad.gif.

У меня картинка term.bmp имеет размеры 19×40 пикселей, а картинка grad.bmp 13×12 пикселей. Потом нам потребуется конвертировать две картинки с помощью онлайн-сервиса www.rinkydinkelectronics.com

выбираем наш файл изображения и жмем Make File

Жмем на Click here to download your file и сохраняем файл grad.c в папку с нашим скетчем, тоже самое проделываем с другим изображением. Сохраняем и закрываем скетч. При повторном открытии он будет иметь еще две вкладки с файлами изображений.

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

а потом отобразим наши изображения на экране OLED дисплея, добавив строки

Добавим в наш скетч на два цикла. В первом цикле у нас будет отображаться время – назовем его void watch(); Второй цикл будет считывать и отображать температуру void temp();

А в основном цикле void loop(); пропишем для ротации циклов несколько строчек кода

В цикле void temp(); пропишем кусочек кода для считывания и отображения температуры

В цикле void watch(); пропишем наш код, который отвечает за отображение времени

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

Принципиальная схема

Используя универсальный микроконтроллерный модуль ARDUINO UNO и двухстрочный ЖК-дисплей типа 1602А (на основе контроллера HD44780) можно легко сделать такой прибор. В одной строке он будет показывать напряжение U1, в другой — напряжение U2.

Рис. 1. Принципиальная схема двойного вольтметра с дисплеем 1602A на Arduino UNO.

Но, прежде всего, хочу напомнить, что ARDUINO UNO это относительно недорогой готовый модуль, — небольшая печатная плата, на которой расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-программатор и источник питания.

Тем, кто незнаком с ARDUINO UNO, советую сначала ознакомиться со статьями Л.1 и Л.2. Схема двойного вольтметра показана на рис. 1. Он предназначен для измерения двух напряжений от 0 до 100V (практически, до 90V).

Как видно из схемы, к цифровым портам D2-D7 платы ARDUINO UNO подключен модуль жидкокристаллического индикатора Н1 типа 1602А. Питается ЖК-индикатор от стабилизатора напряжения 5V, имеющегося на плате стабилизатора напряжения 5V.

Измеряемые напряжения поступают на два аналоговых входа А1 и А2. Всего аналоговых входов шесть, — А0-А5, можно было выбрать любые два из них. В данном случае, выбраны А1 и А2. Напряжение на аналоговых портах может быть только положительным и только в пределах от нуля до напряжения питания микроконтроллера, то есть, номинально, до 5V.

Выход аналогового порта преобразуется АЦП микроконтроллера в цифровую форму. Для получения результата в единицах вольт, нужно его умножить на 5 (на опорное напряжение, то есть, на напряжение питания микроконтроллера) и разделить на 1024.

Для того чтобы можно было измерять напряжение более 5V, вернее, более напряжения питания микроконтроллера, потому что реальное напряжение на выходе 5-вольтового стабилизатора на плате ARDUINO UNO может отличаться от 5V, и обычно немного ниже, нужно на входе применить обычные резистивные делители. Здесь это делители напряжения на резисторах R1, R3 и R2, R4.

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

К = R3 / (R1+R3) или К = R4 / (R2+R4),

соответственно для разных входов двойного вольтметра.

Очень любопытно то, что резисторы в делителях совсем не обязательно должны быть высокоточными. Можно взять обычные резисторы, затем измерить их фактическое сопротивление точным омметром, и уже в формулу подставить эти измеренные значения. Получится значение «К» для конкретного делителя, которое и нужно будет подставлять в формулу.

цифровая электроника вычислительная техника встраиваемые системы

Вольтметр на Arduino

В этой статье приводится интересная схема для любителей экспериментов и Arduino. В ней представлен простой цифровой вольтметр, который может безопасно измерять постоянное напряжение в диапазоне от 0 до 30 В. Сама плата Arduino может питаться от стандартного источника 9 В.

Как известно, с помощью аналогового входа Arduino можно измерить напряжение от 0 до 5 В (при стандартном опорном напряжении 5 В). Но этот диапазон можно расширить, воспользовавшись делителем напряжения.

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

Аналоговый датчик в составе Arduino определяет напряжение на аналоговом входе и преобразует его в цифровой формат, воспринимаемый микроконтроллером. К аналоговому входу A0 мы подключаем делитель напряжения, образованный сопротивлениями R1 (100K) и R2 (10K). С такими значениями сопротивлений на Arduino можно подавать до 55 В, поскольку коэффициент деления в данном случае получается 11, поэтому 55В/11=5В. Для того, чтобы быть уверенным в безопасности измерений для платы, лучше проводить измерение напряжения в диапазоне от 0 до 30 В.

Если показания дисплея не соответствуют показанием поверенного вольтметра, следует использовать прецизионный цифровой мультиметр для нахождения точных значений R1 и R2. При этом в коде нужно будет заменить R1=100000.0 и R2=10000.0 своими значениями. Затем стоит проверить питание, измерив на плате напряжение между 5V и GND. Напряжение может быть 4.95 В. Тогда в коде vout = (value * 5.0) / 1024.0 нужно заменить 5.0 на 4.95. Желательно использовать прецизионные резисторы с погрешностью не более 1%. Помните, что напряжение выше 55 В может вывести плату Arduino из строя!

Плата Arduino UnoРезистор 100 КОмРезистор 10 КОмРезистор 100 ОмПотенциометр 10 КОмLCD-дисплей 16×2

Приложение для Android для передачи данных Arduino при помощи Bluetooth

Специально для проекта этих умных часов мы создали приложение для Android в среде Android Studio, которое можно скачать по этой ссылке. После скачивания установите это приложение в свой смартфон на Android, включите Bluetooth и установите связь с модулем HC-06. По умолчанию пароль для HC-06 — 1234 или 0000. При желании вы можете использовать любое другое подобное приложение из магазина PlayStore.

На следующем рисунке показан пример работы данного приложения (оно называется OLED) когда оно установило связь с модулем HC-06.

Это приложение может показывать все основные параметры работы смартфона как показано на следующем рисунке.

Приложение для Android для контроля потребления электроэнергии

Вы можете использовать приложение для Android для контроля описанных значений потребления электроэнергии и счета за электричество. Для этого скачайте MQTT Dashboard android app из Play store.

Чтобы осуществить в нем соединение с io.adafruit.com выполните следующую последовательность шагов.

Шаг 1. Откройте приложение и кликните в нем на знак “+”. Напишите в поле Client Id любое значение которое захотите. Сервер и порт оставьте такими как показано на следующем рисунке.

Вы можете получить имя пользователя (Username) и пароль (Active key) с приборной доски AdaFruit IO как показано на следующем рисунке.

Шаг 2. Выберите Electricity Meter (измеритель электричества) и выберите Subscribe (подписаться). Для подписки укажите дружественное (сетевое) имя (friendly name) и тему (topic) в формате ‘yourusername’/feeds/’feedname’, затем нажмите create (создать).

Шаг 3. Аналогичным образом сделайте подписку на значение счета за электричество (bill feed).

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

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

Исходный код программы

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

В программе мы должны сообщить плате Arduino, к каким ее контактам подключен ЖК дисплей. Контакт RS ЖК дисплея подключен к цифровому контакту 2 платы Arduino, а контакт Enable – к цифровому контакту 3 платы Arduino. Контакты данных ЖК дисплея (D4-D7) подключены к цифровым контактам 4,5,6,7 платы Arduino.

Arduino

LiquidCrystal lcd(2,3,4,5,6,7); //rs,e,d4,d5,d6,d7

1 LiquidCrystallcd(2,3,4,5,6,7);//rs,e,d4,d5,d6,d7

Затем в программе мы должны инициализировать необходимые нам переменные.

Arduino

int Vin=5; //напряжение на контакте 5V платы arduino
float Vout=0; //напряжение на контакте A0 платы arduino
float R1=3300; //значение сопротивления известного резистора
float R2=0; // значение сопротивления неизвестного резистора

1
2
3
4

intVin=5;//напряжение на контакте 5V платы arduino

floatVout=;//напряжение на контакте A0 платы arduino

floatR1=3300;//значение сопротивления известного резистора

floatR2=;// значение сопротивления неизвестного резистора

Далее в программе мы должны инициализировать наш ЖК дисплей.

Arduino

lcd.begin(16,2);

1 lcd.begin(16,2);

Затем мы должны считать значение на выходе АЦП контакта A0.

Далее значение с выхода АЦП (оно в диапазоне от 0 до 1023) конвертируется в значение напряжения.

Arduino

buffer=a2d_data*Vin;
Vout=(buffer)/1024.0;

1
2

buffer=a2d_data*Vin;

Vout=(buffer)1024.0;

Далее в коде программе исходя из найденного значения напряжения мы рассчитываем значение сопротивления R2.

Arduino

buffer=Vout/(Vin-Vout);
R2=R1*buffer;

1
2

buffer=Vout(Vin-Vout);

R2=R1*buffer;

Далее найденное значение сопротивления резистора R2 выводится на экран ЖК дисплея.

Arduino

lcd.setCursor(4,0);
lcd.print(«ohm meter»);
lcd.setCursor(0,1);
lcd.print(«R (ohm) = «);
lcd.print(R2);

1
2
3
4
5

lcd.setCursor(4,);

lcd.print(«ohm meter»);

lcd.setCursor(,1);

lcd.print(«R (ohm) = «);

lcd.print(R2);

Если вас заинтересовал данный проект, то вы можете следующие похожие проекты на нашем сайте:
— цифровой вольтметр на Arduino;
— цифровой амперметр на Arduino;
— частотомер на Arduino;
— измеритель емкости на Arduino.

Далее приведен полный код программы.

Arduino

#include<LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7); //rs,e,d4,d5,d6,d7
int Vin=5; //напряжение на контакте 5V платы arduino
float Vout=0; //напряжение на контакте A0 платы arduino
float R1=3300; //значение сопротивления известного резистора
float R2=0; // значение сопротивления неизвестного резистора
int a2d_data=0;
float buffer=0;
void setup()
{
lcd.begin(16,2);
}
void loop()
{
a2d_data=analogRead(A0);
if(a2d_data)
{
buffer=a2d_data*Vin;
Vout=(buffer)/1024.0;
buffer=Vout/(Vin-Vout);
R2=R1*buffer;
lcd.setCursor(4,0);
lcd.print(«ohm meter»);
lcd.setCursor(0,1);
lcd.print(«R (ohm) = «);
lcd.print(R2);

delay(1000);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#include<LiquidCrystal.h>

LiquidCrystallcd(2,3,4,5,6,7);//rs,e,d4,d5,d6,d7

intVin=5;//напряжение на контакте 5V платы arduino

floatVout=;//напряжение на контакте A0 платы arduino

floatR1=3300;//значение сопротивления известного резистора

floatR2=;// значение сопротивления неизвестного резистора

inta2d_data=;

floatbuffer=;

voidsetup()

{

lcd.begin(16,2);

}

voidloop()

{

a2d_data=analogRead(A0);

if(a2d_data)

{

buffer=a2d_data*Vin;

Vout=(buffer)1024.0;

buffer=Vout(Vin-Vout);

R2=R1*buffer;

lcd.setCursor(4,);

lcd.print(«ohm meter»);

lcd.setCursor(,1);

lcd.print(«R (ohm) = «);

lcd.print(R2);

delay(1000);

}

}

КОМПОНЕНТЫ

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

Цифрами обозначены:

1. Микроконтроллер Arduino Nano, вернее, его аналог, изготовленный безымянным китайским производителем, но работающий при этом не хуже настоящего.

2. Комбинированная плата Data Logging Board фирмы Deek-Robot, объединяющая в себе модуль часов реального времени и модуль адаптера карты microSD.

3. Модуль АЦП на базе 4-канальной 16-разрядной микросхемы ADS1115 фирмы Texas Instruments

4. Модуль датчика тока на базе микросхемы ACS712 фирмы Allegro (таких модулей нужно 2 штуки). Максимальный измеряемый модулем ток 5А.

5. Три кнопки без фиксации 12×12 мм с цветными колпачками

6. Модуль символьного LCD дисплея 1602 (16 символов, 2 строки) с припаянным к нему конвертером интерфейса I2C

7. Разъем для подключения внешнего источника питания 9V

Общие сведения об OLED дисплеях

OLED означает “Organic Light emitting diode“, что переводится как органический светоизлучающий диод, или, более коротко – органический светодиод. OLED дисплеи для радиолюбителей изготавливаются по той же самой технологии, что и большинство современных телевизоров, но имеют гораздо меньше пикселов по сравнению с ними. Но устройства на их основе (в том числе и с использованием Arduino) смотрятся потрясающе.

В нашем проекте мы будем использовать монохромный 7-пиновый SSD1306 0.96” OLED дисплей. Причина, по которой мы выбрали данный дисплей, заключается в том, что он может работать с тремя разными протоколами связи, трехпроводный SPI (Serial Peripheral Interface — последовательный интерфейс) режим, четырехпроводный SPI режим и режим IIC. В данной статье мы рассмотрим его подключение по четырехпроводному SPI режиму как самому скоростному из приведенных.

Контакты дисплея и выполняемые ими функции описаны в следующей таблице.

Номер контакта Название контакта Альтернативное название контакта Назначение контакта
1 Gnd Ground земля
2 Vdd Vcc, 5V напряжение питания (в диапазоне 3-5 В)
3 SCK D0, SCL, CLK контакт синхронизации (clock pin). Применяется в интерфейсах I2C и SPI
4 SDA D1, MOSI контакт данных. Применяется в интерфейсах I2C и SPI
5 RES RST, RESET контакт сброса модуля. Применяется в интерфейсе SPI
6 DC A0 контакт команд (Data Command pin). Применяется в интерфейсе SPI
7 CS Chip Select (выбор чипа) используется когда несколько устройств взаимодействуют по интерфейсу SPI

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

Настройка

В основном, требования к запуску проекта «вольтметр на Arduino» на независимой печатной плате – это источник питания 5 В, 16-мегагерцовый кварцевый генератор и, конечно же, связанные выводы микроконтроллера со всеми цифровыми и аналоговыми портами платы Arduino. Диаграмма ниже популярна в Интернете и объясняет, как нужно использовать схему для работы в качестве прототипа.

Новые компоненты, которые необходимо добавить в прототип для работы на печатной плате:

  • 1 28-контактный паяльник для пайки (для микроконтроллера Atmega);
  • 1 разъем питания для печатной платы;
  • 1 регулятор LM78L05;
  • 1 1uf конденсатор;
  • 1 конденсатор 10футов;
  • 1 кварцевый генератор 16 МГц;

С новыми компонентами и выводом микроконтроллера имеем следующую схему проекта «Ардуино-вольтметр»:

Еще на просторах Интернета можно найти такую схему вольтметра:

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

Работа схемы

Схема измерителя электроэнергии на основе ESP12 и Arduino представлена на следующем рисунке.

Для модуля ESP12/NodeMCU необходимо сделать следующие соединения:

  • подсоединить контакт Rx ESP12 к контакту Tx платы Arduino;
  • подсоединить контакт Tx ESP12 к контакту Rx платы Arduino.

У NodeMCU (ESP12) нет аналоговых контактов, поэтому для связи с данным модулем мы использовали порт последовательной связи. Но данный модуль работает с напряжениями 3.3 Вольта, поэтому чтобы не повредить его напряжением 5 В с контактов Arduino мы использовали делитель напряжения.

Выходной контакт датчика тока в схеме подключен к аналоговому контакту A0 платы Arduino.

Внешний вид собранной схемы показан на следующем рисунке.

Чтобы осуществлять контроль расходования электроэнергии через интернет мы использовали MQTT брокера, реализованного на платформе AdaFruit IO. Для этого необходимо выполнить следующие действия:

  1. Зарегистрировать себе аккаунт на AdaFruit для хранения и считывания данных потребления электроэнергии.
  2. Создать Applet (прикладную программу) в сервисе IFTTT для формирования сообщений при помощи SMS/Email.
  3. Написать коды программ для Arduino и ESP12 Wi-Fi модуля.

Более подробно все эти процессы описаны далее в статье.