Diy: a 5 minutes arduino voltmeter with an oled display

Краткое введение в технологию Li-Fi

Как уже упоминалось, Li-Fi является достаточно прогрессивной технологией и с ее помощью можно обеспечить связь в 100 раз более быструю, чем с помощью технологии Wi-Fi. Данные в технологии Li-Fi передаются с помощью света. Есть даже проекты организации высокоскоростного интернета с помощью технологии Li-Fi – представляет каким скоростным его можно было бы сделать.

Технология Li-Fi использует видимый свет в качестве среды переноса данных. Светодиод может выступать в качестве источника света, а фотодиод (фоторезистор) – в качестве приемника света. Управляя импульсами света на передающей стороне, мы можем передавать уникальные образцы данных. Эти процессы можно осуществлять на очень высокой скорости и на частотах света, невидимого человеческому глазу.

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

Для повышения точности созданного устройства потребуется провести эксперимент. Первое значение получаем от вольтметра на Ардуино с выводом на ПК, вторую – с помощью необходимой функции. Поменяем константу (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 часы сначала должны отображать время, а потом температуру как на видео в начале статьи.

КОМПОНЕНТЫ

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

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

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

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

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

Сначала в программе нам необходимо подключить все используемые библиотеки (в нашем случае мы будем использовать только одну библиотеку – для работы с ЖК дисплеем). Затем мы будем считывать значения напряжения в двух точках с помощью функции 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);

}

Концепция цветового кода резисторов

Чтобы определить сопротивление резистора, мы можем использовать следующую формулу:

\(R = AB \cdot 10^C \pm T\%\)

где

  • A – значение для цвета первой полосы
  • B – значение для цвета второй полосы
  • C – значение для цвета третьей полосы
  • T – значение для цвета четвертой полосы

Таблица ниже показывает цветовой код резисторов.

Цветовая маркировка резисторов
Цвет Числовое значение кода Степень десяти (10C) Точность (T)
черный 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%

Например, если цветовые коды на резисторе будут коричневый – зеленый – красный – серебряный, то номинал резистора рассчитывается следующим образом:

Первые три полосы соответствуют R = AB*10C

\(R = 15 \cdot 10^{+2}\)

R = 1500 Ом

Четвертая полоса указывает на точность ±10%

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

Примеры

Рассмотрим тестовый пример, который отправляет строку Hello from #<счётчик>:

Отправка

#include <Gyver433.h>
Gyver433_TX<2> tx;  // указали пин

void setup() {
}

char data[] = "Hello from #xx"; // строка для отправки
byte count = 0;                 // счётчик для отправки

void loop() {
  // добавляем счётчик в строку
  data = (count / 10) + '0';
  data = (count % 10) + '0';
  if (++count >= 100) count = 0;
  tx.sendData(data);
  delay(100);
}

Приём

#include <Gyver433.h>
Gyver433_RX<2, 20> rx;  // указали пин и размер буфера

void setup() {
  Serial.begin(9600);  
  attachInterrupt(0, isr, CHANGE);  // прерывание пина радио по CHANGE
}

// спец. тикер вызывается в прерывании
void isr() {
  rx.tickISR();
}

void loop() {
  if (rx.gotData()) {                   // если успешно принято больше 0
    Serial.write(rx.buffer, rx.size);   // выводим
    Serial.println();
  }
}

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

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

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

Определение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Схема устройства представлена на следующем рисунке.

От платы Arduino Uno осуществляется питание всех остальных компонентов схемы. Выход датчика измерения силы тока подключен к одному из аналоговых контактов платы Arduino. ЖК дисплей подключен к цифровым контактам Arduino (7,8,9,10,11,12).

ЖК дисплей содержит 16 контактов, первые два контакта (VSS,VDD) и последние два контакта (анод и катод) подключены к земле и 5v. Контакты сброса (RS) и доступности (E) подключены к цифровым контактам Arduino 7 и 8. Контакты данных D4-D7 подключены к цифровым контактам Arduino (9,10,11,12). Контакт V0 подключен к средней точке потенциометра. Красный и черный провода – соответственно 5v и gnd (земля).

Почему analogRead() возвращает значение от 0 до 1023?

Это связано с разрешением АЦП. Разрешение (в рамках этой статьи) — это степень, в которой что-то может быть представлено численно. Чем выше разрешение, тем выше точность, с которой что-то можно представить. Мы измеряем разрешение в терминах количества бит разрешения.

Например, 1-битное разрешение позволит использовать только два (два в степени одного) значения — ноль и единицу. 2-битное разрешение позволило бы получить четыре (два в степени двух) значения — ноль, один, два и три. Если мы попытаемся измерить диапазон в пять вольт с двухбитным разрешением, а измеренное напряжение будет равно четырем вольтам, наш АЦП вернет числовое значение 3 — при падении четырех вольт между 3,75 и 5В. Проще представить это с изображением выше.

Таким образом, в нашем примере АЦП с 2-битным разрешением может представлять напряжение только с четырьмя возможными результирующими значениями. Если входное напряжение падает между 0 и 1,25, АЦП возвращает цифру 0; если напряжение падает между 1,25 и 2,5, АЦП возвращает числовое значение 1. И так далее. С диапазоном АЦП нашего Arduino от 0 до 1023 — у нас есть 1024 возможных значения — или от 2 до 10, поэтому у наших Arduino есть АЦП с 10-битным разрешением.

Поверка вольтметра

Поверка вольтметра заключается в сравнении показаний вольтметра на ардуино с рабочим вольтметром (мультиметром). Если значения отличаются, нужно проверить напряжение на пинах Ардуино 5V и GND. Напряжение может слегка отличаться от 5 вольт. Например, 4,95 В. Тогда в формуле temp = (analogvalue * 5.0) / 1024.0 нужно значение 5 заменить на 4,95. И также необходимо проверить точное сопротивление резисторов R1 и R2 и в строчки float r1=100000.0 и float r2=10000.0 вписать свои значения. После такой поверки мы получим точный вольтметр на Ардуино. Данный прибор способен измерять напряжение до сотых вольт.
И напоследок хотел бы предостеречь вас. Использовать данный вольтметр для измерения 55 вольт не рекомендуется. Это максимальный предел. При незначительном скачке измеряемого напряжения микроконтроллер выйдет из строя. Необходимо дать некий запас для непредвиденных ситуаций. И ограничить диапазон измеряемого напряжения до 45 вольт.

Что такое AREF?

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

Для более популярных плат Arduino, таких как платы Uno, Mega, Duemilanove и Leonardo / Yún, рабочее напряжение 5В. Если у вас есть плата Arduino Due, рабочее напряжение составляет 3,3 В. Таким образом, если у Вас есть опорное напряжение 5 В, каждый блок, возвращаемого analogRead() оценивается в 0.00488 В. (Это рассчитывается путем деления 1024 на 5В). Что если мы хотим измерить напряжения между 0 и 2 или 0 и 4,6? Как АЦП узнает, что составляет 100% от нашего диапазона напряжений?

И в этом заключается причина существования вывода AREF. AREF означает Analog Reference. Это позволяет нам «скормить» Arduino опорное напряжение от внешнего источника питания. Например, если мы хотим измерить напряжения с максимальным диапазоном 3,3 В, мы бы подали хорошие плавные 3,3 В на вывод AREF, например, от ИС регулятора напряжения.

Тогда каждый шаг АЦП будет представлять около 3,22 милливольт (разделить 1024 на 3,3В)

Обратите внимание, что самое низкое опорное напряжение вы можете иметь 1.1В. Существует две формы AREF — внутренняя и внешняя, поэтому давайте их проверим

Основные положения закона Ома

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

V = IR

V — напряжение на проводнике в вольтах (В),
I — ток, проходящий через проводник в амперах (А),
R – сопротивление проводника в омах (Ω).

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

I = V / R

То есть для нахождения значения тока нам нужно знать всего 2 величины: напряжение и сопротивление.

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

Согласно приведенной схемы мы будем находить 2 значения напряжения. Разница между напряжениями (V1-V2) на двух концах резистора даст нам падение напряжения на резисторе (R), и когда мы разделим падение напряжения на сопротивление резистора, мы получим силу тока (I) через устройство.

Установка библиотеки для модуля OLED

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

Чтобы установить библиотеку, перейдите в раздел Sketch > Include Library > Manage Libraries…. Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.

Отфильтруйте результаты поиска, введя adafruit ssd1306. Там должна быть пара записей. Ищите Adafruit SSD1306 от Adafruit. Нажмите на эту запись, а затем выберите Установить.

Библиотека Adafruit SSD1306 представляет собой аппаратную библиотеку, которая выполняет функции более низкого уровня. Она должна быть сопряжена с библиотекой Adafruit GFX для отображения графических примитивов, таких как точки, линии, круги, прямоугольники и т. д. Также установите и эту библиотеку.

Повышаем точность

Пока большие допуски внутреннего источника питания 1.1 В. значительно ограничивают точность измерений при использовании в серийном производстве, для индивидуальных проэктов мы можем добиться большей точности. Сделать это просто, просто измерив Vcc с помощью вольтметра и нашей функции readVcc(). Далее заменяем константу 1125300L новой переменной:

scale_constant = internal1.1Ref * 1023 * 1000

internal1.1Ref = 1.1 * Vcc1 (показания_вольтметра) / Vcc2 (показания_функции_readVcc())

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

Вывод

С этой маленькой функцией можно сделать многее. Вы можете использовать стабильное опорное напряжение близкое к 5.0 В не имея на самом деле 5.0 В на Vcc. Вы можете измерять напряжение вашей батареи или даже увидеть на каком вы питание от батареи или от стационарного источника питания.

И наконец, код будет поддерживать все Arduino, включая новый Leonardo, а также чипы ATtinyX4 и ATtinyX5 серий.

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

Как вам вероятно известно, аналоговые входы Ардуино можно использовать для измерения постоянного напряжения в диапазоне 0 – 5В и этот диапазон можно увеличить,
используя два резистора в качестве делителя напряжения. Делитель уменьшит измеряемое напряжение до уровня аналоговых входов Ардуино. А затем программа вычислит реальную величину напряжения.

Аналоговый датчик на плате Ардуино определяет наличие напряжения на аналоговом входе и преобразует его в цифровую форму для дальнейшей обработки микроконтроллером. На рисунке напряжение подается на аналоговый вход (А0) через простой делитель напряжения, состоящий из резисторов R1 (100кОм) и R2 (10кОм).

При этих значениях делителя на плату Ардуино можно подавать напряжение от 0 до
55В. На входе А0 имеем измеряемое напряжение деленное на 11,т.е.55В / 11=5В. Иначе говоря, при измерении 55В на входе Ардуино имеем максимально допустимое значение 5В. На практике лучше на этом вольтметре написать диапазон “0 – 30В”, чтобы оставался
Запас по безопасности!

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

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

В программе мы должны сообщить плате 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);

}

}

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

Используя универсальный микроконтроллерный модуль 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),

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

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

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

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

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

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