Узнаем напряжение питания Arduino
Часто в проектах c Arduino необходимо получать аналоговые значения с различных аналоговых датчиков, при этом, в большинстве случаев, источники внешнего опорного напряжения для АЦП не используются.
Мы просто читаем значение АЦП функцией analogRead( ВЫВОД ) , получаем число от 0 до 1023, которое преобразуем в напряжение по формуле: U = analogRead( ВЫВОД ) * 5.0 / 1023
где 5.0 — это напряжение питания Arduino в Вольтах, а 1023 — это максимальное значение АЦП.
Ошибки при чтении аналоговых значений:
Если в проекте используются только слаботочные модули или раздельное питание, то все аналоговые данные будут актуальны. Но если имеются модули потребляющие значительные токи (моторы, сервоприводы, соленоиды, осветительные приборы и т.д.) и они подключены к питанию Arduino, то это питание может снизится, и полученные аналоговые данные будут некорректны.
-
Пример:
- На аналоговом входе 2.0 В, питание 5.0 В, функция analogRead() вернёт значение 409.
- На аналоговом входе 2.0 В, питание 4.5 В, функция analogRead() вернёт значение 455.
- Используя формулу U = analogRead( ВЫВОД ) * 5.0 / 1023 , мы получим:
- в первом случае: U = 409 * 5.0 / 1023 = 2,0 В. — Верно.
- во втором случае: U = 455 * 5.0 / 1023 = 2,2 В. — Ошибка.

- Но если нам известно реальное напряжение питания (Uпит), которое мы будем указывать в формуле пересчёта U = analogRead( ВЫВОД ) * Uпит / 1023 , то получим:
- в первом случае: U = 409 * 5.0 / 1023 = 2,0 В. — Верно.
- во втором случае: U = 455 * 4.5 / 1023 = 2,0 В. — Верно.

Значит для исключения ошибки при чтении напряжений с аналоговых входов, нужно точно знать напряжение питания Arduino.
Контроль за напряжением питания Arduino:
Многие Arduino проекты являются портативными, источником питания которых являются аккумуляторы с DC-DC преобразователями.
Напряжение аккумулятора уменьшается по мере его разряда и DC-DC преобразователь увеличивает потребляемый ток для поддержания стабильного напряжения на выходе. Но рано или поздно, напряжение на выходе DC-DC преобразователя так же начнёт снижаться. Если в схеме питания не предусмотрено отключение при снижении напряжения ниже определённого порога (≈4В), это может привести к нестабильной работе Arduino с непредсказуемым результатом.
Таких последствий можно избежать, если в коде Arduino постоянно контролировать напряжение питания и, например, уходить в спящий режим при снижении питания ниже 4,5 В.
Чтение напряжения питания Arduino:
Для чтения напряжения питания Arduino достаточно подключить разработанную нами библиотеку iarduino_VCC. После чего вам будет доступна функция analogRead_VCC() , возвращающая напряжение питания в вольтах.
Библиотека не требует создания объектов, подключения внешних деталей, делителей, модулей и т.д. Она не использует ни одного вывода Arduino. Просто у вас появится возможность получать напряжение питания Arduino функцией analogRead_VCC() .
#include // Подключаем библиотеку для чтения напряжения питания. // void setup() < // Serial.begin(9600); // Инициируем передачу данных по шине UART на скорости 9600 бит/сек. >// // void loop() < // float i = analogRead_VCC(); // Читаем напряжение питания Arduino. Serial.println( i ); // Выводим напряжение питания Arduino. delay(1000); // >//
После загрузки данного скетча, в монитор последовательного порта будет выводиться напряжение питания Arduino. Если Arduino получает питание от компьютера по USB кабелю, то указанное напряжение равно напряжению USB порта вашего компьютера.
Принцип работы:
В микроконтроллерах плат Arduino UNO, Mini, Nano, Mega . всего один блок АЦП и он может подключаться к любому аналоговому входу. Обращаясь к функции analogRead( ВЫВОД ) , она переключает вход АЦП на указанный вывод, запускает преобразование АЦП и возвращает результат.

Как видно из схемы, вход АЦП может подключаться не только к аналоговым входам, но и к встроенному в микроконтроллер датчику температуры, выводу GND или внутреннему источнику опорного напряжения (ИОН).
Функция analogRead_VCC() переключает вход АЦП на выход ИОН 1V1, а источником опорного напряжения для АЦП выбирает напряжение питания Uпит. Получается что функция читает напряжение ИОН 1V1, которое заведомо известно Uион = 1,1В. Следовательно по показаниям АЦП можно выяснить точное значение напряжения питания Uпит = Uион * 1023 / АЦП.
В действительности напряжение ИОН 1V1 микроконтроллеров Arduino может отличаться от заявленных 1,1 В на сотые доли. По этому в библиотеке имеются две дополнительные функции, позволяющие определить и указать точное напряжение ИОН 1V1.
Основная функция библиотеки:
Функция analogRead_VCC();
- Назначение: Чтение напряжения питания Arduino.
- Синтаксис: analogRead_VCC();
- Параметры: Нет.
- Возвращаемые значения: float — Напряжение питания в Вольтах.
- Примечание:
- Точность показаний до десятых долей вольт, без использования дополнительных функций.
float i = analogRead_VCC(); // Читаем напряжение питания Arduino.
Дополнительные функции библиотеки:
Дополнительные функции библиотеки позволяют увеличить точность чтения напряжения питания Arduino до сотых долей вольт. Если такая точность не требуется, то дополнительными функциями можно не пользоваться.
Функция analogCalc_1V1();
- Назначение: Определение точного напряжения источника опорного напряжения (ИОН) 1V1.
- Синтаксис: analogCalc_1V1( Uпит );
- Параметры: float Uпит — Напряжение питания Arduino в Вольтах.
- Возвращаемые значения: float — Напряжение ИОН в Вольтах.
- Примечание:
- Напряжение ИОН 1V1 используется при чтении напряжения питания Arduino.
- Напряжение ИОН 1V1 у разных микроконтроллеров может отличаться от 1,1 В.
- Точное напряжение ИОН 1V1 микроконтроллера достаточно определить 1 раз.
- Для получения точного напряжения ИОН 1V1 нужно измерить текущее напряжение питания Arduino (вольтметром) и указать его в качестве единственного параметра функции.
- Полученное напряжение ИОН 1V1 справедливо только для того микроконтроллера, для которого оно было получено. Его можно более не определять, а только указывать функцией analogSave_1V1().
float i = analogCalc_1V1( 5.07 ); // Определяем точное напряжение ИОН 1V1 микроконтроллера указав измеренное вольтметром напряжение питания Arduino.
Функция analogSave_1V1();
- Назначение: Указание точного напряжения ИОН 1V1 микроконтроллера Arduino.
- Синтаксис: analogSave_1V1( Uион );
- Параметры: float Uион — Напряжение ИОН 1V1 микроконтроллера Arduino.
- Возвращаемые значения: Нет.
- Примечание:
- Напряжение ИОН 1V1 используется при чтении напряжения питания Arduino.
- Если напряжение ИОН 1V1 не указано данной функцией, то оно принимается за 1,1 В.
- Получить точное напряжение ИОН 1V1 можно функцией analogCalc_1V1().
- Функцию достаточно вызвать 1 раз в коде setup().
void setup() < // analogSave_1V1( 1.125f ); // Указываем точное напряжение ИОН 1V1 микроконтроллера. >// void loop() < // float i = analogRead_VCC(); // Читаем напряжение питания Arduino. >//
Ссылки:
- Библиотека iarduino_VCC.
- Wiki — Установка библиотек в Arduino IDE.
Arduino: как измерить напряжение


Программирование
На чтение 9 мин Просмотров 1.7к. Опубликовано 31.01.2023
Вольтметр переменного тока Arduino
Этот проект Arduino будет представлять собой простой вольтметр переменного тока на основе Arduino, который может очень легко измерять 220 вольт и не требует внешнего датчика. Используя операционный усилитель в качестве другого усилителя, мы понизим 220 В переменного тока до уровня напряжения, который может измерить АЦП Arduino.

Требуемые компоненты
Ниже приведены основные компоненты, необходимые для разработки детектора переменного напряжения с Arduino:
- Arduino Uno R3: это основной компонент этого проекта. Он измеряет аналоговое напряжение с помощью встроенных аналоговых каналов и преобразует аналоговое измеренное напряжение в цифровое значение, а затем мы преобразуем это измеренное цифровое значение обратно в напряжение, умножая его на коэффициент разрешения АЦП Arduino.
- ЖК-дисплей 16 x 2: жидкокристаллический дисплей используется для отображения измеренного значения напряжения. Если вы не знаете, как связать ЖК-дисплей с Arduino, я предлагаю вам ознакомиться с этим руководством по взаимодействию ЖК-дисплея с Arduino.
- Дифференциальный усилитель: в этом методе измерения переменного напряжения дифференциальный усилитель используется для понижения напряжения с 220 вольт переменного тока до менее 3,3 вольт переменного тока. Я объясню это более подробно в следующем разделе этой статьи.
Датчик напряжения переменного тока с операционным усилителем

Для измерения переменного напряжения с помощью Arduino в первую очередь необходимо сконструировать датчик измерения напряжения переменного тока. Например, если вы хотите измерить напряжение величиной 220 вольт переменного тока. Вам нужно сначала уменьшить это напряжение. Потому что Arduino имеет встроенные каналы АЦП и максимальное напряжение, которое может измерить аналоговый канал Arduino, составляет 5 вольт. Следовательно, мы не можем измерить напряжение больше 5 вольт с помощью аналого-цифрового преобразователя Arduino напрямую. Вы также должны знать, как измерить аналоговое напряжение с помощью Arduino или как использовать аналоговые каналы Arduino.
Как использовать аналоговые каналы Arduino (АЦП)
Чтобы понять аналого-цифровой преобразователь Arduino R3, постройте следующую схему. Вам потребуются следующие компоненты:

- Ардуино УНО
- Один 5мм светодиод
- Потенциометр
- Резистор 220 Ом
- Соединительные провода
- Макет
В приведенной выше принципиальной схеме используется переменный резистор. Один вывод переменного резистора соединяется с землей, а другой вывод с 5 вольтами от Ардуино. Центральный вывод переменного резистора соединен с A0, который является каналом 0 АЦП. Анодный вывод светодиода подключен к цифровому выводу 3 Arduino через токоограничивающий резистор 220 Ом. Кроме того, катодный контакт светодиода обычно заземляется с выводами потенциометра и GND Arduino.
Мы запрограммируем эту схему, показанную выше, таким образом, что когда напряжение, считываемое каналом A0, становится больше 3 вольт, светодиод, подключенный к контакту 3, светится, а когда напряжение меньше 3 вольт, светодиод гаснет.
Скетч для Arduino
int sensorPin = A0; // select the input pin for the potentiometer
int ledPin = 3; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
void setup()
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
>
void loop()
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
sensorValue = sensorValue * 5 / 1023 ; //its convert digital value back into voltage
// turn the ledPin on
if (sensorValue >= 3 )
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
>
Как работает данный код
Начните с объявления аналогового вывода Arduino, соединенного с центральным выводом потенциометра. В нашем случае это контакт A0. Мы сохранили его в переменной int «sensorPin».
int sensorPin = A0;
Затем объявите цифровой вывод Arduino, связанный с анодным выводом светодиода. В нашем случае это контакт 3.
Кроме того, создайте переменную int с именем «sensorValue», чтобы хранить значение датчика.
int sensorValue = 0;
Внутри функции setup() настройте ledPin как выходной контакт, используя функцию pinMode(). Он принимает номер вывода в качестве первого параметра и режим в качестве второго параметра.
Внутри функции loop() мы сначала считываем аналоговый сигнал с помощью функции AnalogRead(). В качестве параметра внутри него берется sensorPin. Показания аналогового входа сохраняются в переменной «sensorValue». Оно будет находиться в диапазоне от 0 до 1023, поскольку Arduino имеет 10-битный АЦП (2 * 10 = 1023).
SensorValue = AnalogRead (SensorPin);
Далее будет преобразовано цифровое значение в напряжение. SensorValue умножается на разрешение АЦП Arduino, которое составляет 5/1023. Разрешение также известно как минимальный шаг АЦП для каждого соответствующего значения напряжения. Например, если значение АЦП равно 10, это означает, что было выполнено 10 шагов, или значение на входном контакте в 10 раз превышает разрешение АЦП. Таким образом, чтобы преобразовать цифровое значение обратно в напряжение, мы просто умножаем его на разрешение, как мы сделали в первой строке.
sensorValue = sensorValue * 5 / 1023 ;
Мы будем использовать оператор if-else, чтобы проверить, является ли напряжение> = 3. Если это так, то включите светодиод. В противном случае, если показания напряжения меньше 3, выключите светодиод.
if (sensorValue >= 3 )
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
Демонстрация
Чтобы увидеть демонстрацию приведенного выше кода, загрузите код в Arduino. Но перед загрузкой кода обязательно выберите плату Arduino в меню «Инструменты» > «Плата», а также выберите правильный COM-порт, к которому подключена плата Arduino, в меню «Инструменты» > «Порт».
Когда напряжение больше 3 вольт, светодиод светится. Вольтметр соединен с переменным резистором для проверки напряжения.
Вернёмся к основной теме.
Понижение напряжения переменного тока
Это даст вам представление о том, как использовать аналоговый канал Arduino. Потому что это первый шаг к разработке датчика переменного напряжения с Arduino и измерителя переменного напряжения с Arduino. Как я объяснял ранее, в этом проекте я использовал разностный усилитель для понижения напряжения с 220 вольт переменного тока до менее 3,3 вольт переменного тока. Потому что встроенный АЦП Arduino не может измерять напряжение более 5 вольт.
Поэтому нам нужно найти способ снизить напряжение. Существует много других методов понижения напряжения, таких как трансформатор напряжения или понижающий трансформатор, который является дорогостоящим методом для недорогих приложений. Метод делителя напряжения, это наименее дорогой метод для этой цели. Но у него есть недостаток в меньшем диапазоне напряжения и большем энергопотреблении. Таким образом, мы не можем использовать его в приложениях с критическим питанием.
Поэтому существует другой метод с применением операционного усилителя. Я использую операционный усилитель для понижения. Операционный усилитель используется в качестве разностного усилителя. Регулируя коэффициент усиления операционного усилителя, мы снижаем напряжение до уровня менее 3,3 вольта.
Цепь понижающего напряжения с использованием операционного усилителя
В этой схеме в качестве разностного усилителя используется операционный усилитель LM358. Принципиальная схема дифференциального усилителя приведена ниже:

Вход дифференциального усилителя составляет 220 вольт переменного тока, а выход дифференциального усилителя менее 3,3 вольт. Я также добавил 5 вольт постоянного тока к переменному, чтобы преобразовать отрицательный цикл в положительный цикл. Потому что Arduino не может напрямую измерять отрицательное напряжение.
Снова обратитесь к статье об измерении напряжения переменного тока с помощью микроконтроллера pic для большего понимания и того, почему я добавил уровень постоянного тока 5 вольт в схему. Выход этой схемы подается на аналоговый канал Arduino, который измеряет это напряжение и после выполнения некоторых вычислений отображает измеренное значение напряжения на ЖК-дисплее.
Принципиальная схема измерения напряжения переменного тока с помощью Arduino

Принципиальная схема измерения переменного напряжения с помощью Arduino приведена ниже. В этой схеме мы использовали ЖК-дисплей 16×2 для отображения значения напряжения.
Скетч для Arduino
#include // инициализировать библиотеку номерами выводов интерфейса
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int sensorIn = A3;
double Voltage = 0;
double VRMS = 0;
int i;
void setup()
Serial.begin(9600);
lcd.begin(16,2); // настроить количество столбцов и строк LCD:
>
void loop()
VRMS = voltage_READ();
lcd.setCursor(0,0);
lcd.print(«V=»);
lcd.print(VRMS);
lcd.print(«V»);
Serial.print(«V = «);
Serial.print(VRMS);
Serial.println(«V»);
delay(1000);
>
float voltage_READ(void)
float max;
int i;
unsigned int temp=0;
float maxpoint = 0;
for(i=0;i <500;i++)
if(temp =analogRead(sensorIn),temp>maxpoint)
maxpoint = temp;
>
>
maxpoint = maxpoint *(10.0/1023.0);
maxpoint = (maxpoint -5.0);
maxpoint = maxpoint *110.1909091;
max=maxpoint *.707106781;
return max;
>
Как работает код
В комментариях к коду я использовал LCD – ЖК-дислпей.
Сначала подключите библиотеку жидкокристаллического дисплея и определите номер контакта Arduino, который мы подключаем к ЖК-дисплею 16×2.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Мы будем использовать нулевой аналоговый канал Arduino (A0). Эта строка определяет имя нулевого канала как вывод «sensorIn». Сделав это, мы будем использовать это символическое имя во всем коде вместо номера канала АЦП.
const int sensorIn = A0;
Мы определяем три глобальные переменные для хранения значения напряжения, цифрового значения АЦП и для использования с выполнением циклов.
double Voltage = 0; // сохраняем значение АЦП
double VRMS = 0; //сохраняем среднеквадратичное значение напряжения
int i;// вести подсчет значения цикла
Внутри функции настройки мы объявляем запуск библиотеки LCD для размера 16×2, используя функцию lcd.begin().
lcd.begin(16,2); // устанавливаем количество столбцов и строк ЖК-дисплея
Прежде чем заглянуть внутрь функции loop(), сначала давайте посмотрим на работу подпрограммы voltage_READ().
Функция чтения напряжения
Это основной код проекта вольтметра переменного тока Arduino. Эта функция измеряет пиковое напряжение сигнала переменного тока и преобразует пиковое напряжение в среднеквадратичное (RMS) значение напряжения.
Внутри функции измерения напряжения переменного тока сначала мы берем 500 образцов формы сигнала напряжения переменного тока, используя «петлю» for и аналоговый канал A0 Arduino. Во-первых, мы инициализируем переменную типа float «maxpoint» нулем, и ее значение продолжает обновляться с новым значением выборки ADC, если значение выборки ADC больше, чем текущее удерживаемое значение «maxpoint».
После этого эта строка преобразует цифровое измеренное значение АЦП в напряжение.
maxpoint = maxpoint *(10.0/1023.0);
Наконец, мы получаем исходное измеренное значение напряжения, умножая значение напряжения на коэффициент усиления операционного усилителя.
maxpoint = (maxpoint -5.0); // вычесть усиление по постоянному току из сигнала
maxpoint = maxpoint *110.1909091; // умножить на обратную величину усиления
max=maxpoint *.707106781; // преобразование пикового значения в среднеквадратичное значение
Заключение
Теперь вы умеете измерять напряжение Arduino и можете применять это для своих проектов.
Read Analog Voltage
This example shows you how to read an analog input on analog pin 0, convert the values from analogRead() into voltage, and print it out to the serial monitor of the Arduino Software (IDE).
Hardware Required
- Arduino Board
- 10k ohm potentiometer
Circuit

Connect the three wires from the potentiometer to your board. The first goes to ground from one of the outer pins of the potentiometer. The second goes to 5 volts from the other outer pin of the potentiometer. The third goes from the middle pin of the potentiometer to analog input 0.
By turning the shaft of the potentiometer, you change the amount of resistance on either side of the wiper which is connected to the center pin of the potentiometer. This changes the voltage at the center pin. When the resistance between the center and the side connected to 5 volts is close to zero (and the resistance on the other side is close to 10 kilohms), the voltage at the center pin nears 5 volts. When the resistances are reversed, the voltage at the center pin nears 0 volts, or ground. This voltage is the analog voltage that you’re reading as an input.
The microcontroller of the board has a circuit inside called an analog-to-digital converter or ADC that reads this changing voltage and converts it to a number between 0 and 1023. When the shaft is turned all the way in one direction, there are 0 volts going to the pin, and the input value is 0. When the shaft is turned all the way in the opposite direction, there are 5 volts going to the pin and the input value is 1023. In between, analogRead() returns a number between 0 and 1023 that is proportional to the amount of voltage being applied to the pin.
Schematic

Code
In the program below, the very first thing that you do will in the setup function is to begin serial communications, at 9600 bits of data per second, between your board and your computer with the line:
Next, in the main loop of your code, you need to establish a variable to store the resistance value (which will be between 0 and 1023, perfect for an int datatype) coming in from your potentiometer:
int sensorValue = analogRead(A0);
To change the values from 0-1023 to a range that corresponds to the voltage the pin is reading, you’ll need to create another variable, a float , and do a little math. To scale the numbers between 0.0 and 5.0, divide 5.0 by 1023.0 and multiply that by sensorValue :
float voltage= sensorValue * (5.0 / 1023.0);
Finally, you need to print this information to your serial window as. You can do this with the command Serial.println() in your last line of code:
Now, when you open your Serial Monitor in the Arduino IDE (by clicking on the icon on the right side of the top green bar or pressing Ctrl+Shift+M), you should see a steady stream of numbers ranging from 0.0 — 5.0. As you turn the pot, the values will change, corresponding to the voltage coming into pin A0.
See Also:
- setup()
- loop()
- analogRead()
- int
- Serial
- float
- BareMinimum: The bare minimum of code needed to start an Arduino sketch.
- Blink: Turn an LED on and off.
- DigitalReadSerial: Read a switch, print the state out to the Arduino Serial Monitor.
- AnalogReadSerial: Read a potentiometer, print its state out to the Arduino Serial Monitor.
- Fade: Demonstrates the use of analog output to fade an LED.
- ReadAnalogVoltage : Reads an analog input and prints the voltage to the serial monitor
Last revision 2015/07/29 by SM
Аналоговые выводы
На плате UNO есть шесть выводов, которые подписаны от A0 до A5 (у других плат может быть другое число выводов). Они работают с напряжением от 0 до 5V. Благодаря встроенному АЦП (аналого-цифровой преобразователь), данные входы могут считывать напряжение подаваемое на них. Микроконтроллеры Atmega328, используемые в Arduino UNO, содержат шестиканальный АЦП, разрешение которого составляет 10 бит. Это позволяет на выходе получать значения от 0 до 1023 (всего 1024 градации).
Для чтения показания напряжения есть встроенный метод analogRead(), возвращающий значение от 0 до 1023. Значение 0 относится к 0V, а 1023 к 5V. Таким образом, если мы хотим конвертировать значение от 0 до 5, то нужно произвести деление 1023/5 = 204.6
Имеется также функция analogReference(type). Она задаёт опорное напряжение, относительно которого происходят аналоговые измерения. В проектах для новичков она не используется, поэтому не будем обращать на неё внимания.
Кроме того, аналоговые выходы могут работать как цифровые и обозначаются как 14, 15, 16, 17, 18, 19 вместо A0..A5.
И, наоборот, цифровые порты с символом тильды ~ (3, 5, 6, 9, 10, 11) могут работать как аналоговые выходы, используя ШИМ.
Аналоговые выводы, в отличие от цифровых, не нужно объявлять как вход или выход в начале программы.
Изучим простой пример с одним проводом и аналоговым выводом. Соединим проводом порты A0 и 3.3V. Напишем скетч.
int analogPin = A0; void setup() < Serial.begin(9600); >void loop() < int rawReading = analogRead(analogPin); float volts = rawReading / 204.6; Serial.println(volts); delay(1000); >Откройте окно Serial Monitor и наблюдайте за показаниями. Должны выводиться числа, близкие к значению 3.3: 3.1, 3.2, 3.3. Если, не закрывая программу, вытащить конец провода из порта 3.3V и вставить в порт 5V, то показания изменятся, а на экране появятся числа 5.0. Если перекинуть конец провода на GND, то увидим значения 0.
Таким образом мы видим, что можем получать значения напряжения из аналоговых портов.
Вольтметр
Если мы можем снимать значения из аналоговых портов, то можем использовать микроконтроллер как вольтметр. Достаточно вставить провода в выводы GND и A0 и соединить их с контактами на батарее (минус и плюс соответственно). Вообще такой способ не является суперточным. Хотя он и показывал правдоподобные результаты на пальчиковой батарее 1.5 В и «Кроне» на 9 В, но также показывал результаты, когда провода вообще ни к чему не были присоединены. Но для общего развития оставлю.
/* The simplest voltmeter */ const int analogIn = A0; int raw = 0; float voltage = 0; void setup() < pinMode(analogIn, INPUT); Serial.begin(9600); >void loop() < raw = analogRead(analogIn); voltage = (raw * 5.0 ) / 1024.0; Serial.print("Raw Value = " ); Serial.print(raw); Serial.print("\t Voltage text-info" >01.Basics | AnalogReadSerial (Чтение аналоговых выводов через потенциометр)С помощью потенциометра мы можем менять напряжение и считывать данные с выводов.
Продолжим изучение работы с аналоговыми выводами через пример AnalogReadSerial из меню File | Examples | 01.Basics. Цель урока - плавно изменять напряжение и подавать его на аналоговый вывод, чтобы получить с него текущее значение напряжения.
Нам понадобятся плата Arduino, потенциометр и несколько проводов (или перемычек). Соединяем парные ножки с выводами на плате 5V и GND. Среднюю ножку необходимо соединить с аналоговым выводом на плате, помеченную как A0.

Не важно, какая из крайних ножек потенциометра будет подключена к 5V, а какая к GND, поменяется только направление, в котором нужно крутить ручку для изменения напряжения. Сам сигнал считывается со средней ножки, которая связана с аналоговым портом. Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, подходят только порты, помеченные на плате как ANALOG IN. Они все пронумерованы с префиксом A (A0-A5).
Схема готова. Вращая регулятором потенциометра, мы можем менять сопротивление от 5 Вольт до 0. Arduino позволяет считывать текущее напряжение, которое подаётся на среднюю ножку при помощи аналогового вывода. Результаты могут колебаться от 0 до 1023.
Код
void setup() < // инициализируем соединение на скорости 9600 бит в секунду: Serial.begin(9600); >void loop() < // Считываем данные с аналогового вывода A0 int sensorValue = analogRead(A0); // получаем текущее значение Serial.println(sensorValue); // выводим результат на монитор delay(1); // небольшая задержка для стабильности вывода результатов >Код очень простой. При инициализации устанавливаем нужную скорость связи: Serial.begin(9600);. Далее в цикле мы постоянно считываем данные, поступающие с потенциометра при помощи метода analogRead(). Так как значения будут находиться в диапазоне от 0 до 1023, мы можем использовать тип int для переменной sensorValue.
Полученный результат будем выводить в окно последовательного монитора.
Проверка (Serial Monitor)
Запустите программу, а также откройте окно последовательного монитора. Вращая регулятором потенциометра, вы можете наблюдать, как в окне будут меняться значения от 0 до 1023.
Пример интересен своей универсальностью. Потенциометр является ручным делителем напряжения. Существуют другие детали, которые выполняют такую же работу. Например, фоторезистор меняет напряжение в зависимости от освещённости. Также напряжение может меняться от нажатия, от температуры и т.д. При этом нам не нужно менять программу, просто одну деталь меняем на другую и код будет выполняться. Единственное различие будет в выводимых результатах - каждый делитель напряжения имеет свои характеристики и, соответственно, будет давать свои показания.
Проверка (Serial Plotter)
Начиная с версии Arduino IDE 1.6.6, в настройках появился новый инструмент Plotter (Tools | Serial Plotter), позволяющий выводить простенький график. Обратите внимание, что он не может работать одновременно с последовательным монитором, который следует закрыть.
Вращая ручку потенциометра, можем наблюдать изменение графика.

01.Basics | ReadAnalogVoltage (Напряжение аналоговых выводов через потенциометр)
Рассмотрим урок ReadAnalogVoltage из меню File | Examples | 01.Basics. Он практически идентичен примеру AnalogReadSerial, только мы будем конвертировать значения от аналогового вывода (0. 1023) в значения напряжения (0. 5). Для примера нам понадобится потенциометр. Цель урока - плавно изменять напряжение и подавать его на аналоговый вывод, чтобы получить текущее значение напряжения.
Схема прежняя, ничего не меняем. Соединяем парные ножки с выводами на плате 5V и GND. Среднюю ножку необходимо соединить с аналоговым выводом на плате, помеченную как A0.

Схема готова. Вращая регулятором потенциометра, мы можем менять сопротивление от 5 Вольт до 0. Arduino позволяет считывать текущее напряжение, которое подаётся на среднюю ножку при помощи аналогового вывода. Результаты могут колебаться от 0 до 1023.
Код
void setup() < Serial.begin(9600); >void loop() < // читаем данные с вывода A0: int sensorValue = analogRead(A0); // Конвертируем данные от 0 до 1023) в значения напряжения (0 - 5V): float voltage = sensorValue * (5.0 / 1023.0); // Выводим результат Serial.println(voltage); >Если сравнить два примера, то разница в одной строке float voltage = sensorValue * (5.0 / 1023.0);. В цикле считываем данные, поступающие с потенциометра при помощи метода analogRead(). Так как значения будут находиться в диапазоне от 0 до 1023, мы можем использовать тип int для переменной sensorValue. Используем элементарную математику и делим результат на коэффициент.
Полученный результат будем выводить в окно последовательного монитора.
Запустите программу, а также откройте окно последовательного монитора. Вращая регулятором потенциометра, вы можете наблюдать, как в окне будут меняться значения от 0.00 до 5.00.
Светодиод с плавной регулировкой
Усложним конструкцию, добавив светодиод. Первую часть схему можно было не трогать. Но для экономии в предыдущем примере я соединил ножку потенциометра сразу с портом GND. На этот раз сделаем соединение из двух проводов. Это необходимо, чтобы светодиод тоже мог соединиться с заземлением. Поэтому финальный макет будет следующим.


int potPin = A0; int ledPin = 9; void setup() < // порт для светодиода на выход pinMode(ledPin, OUTPUT); // пин с потенциометром - вход // мы хотим считывать напряжение, // выдаваемое им pinMode(potPin, INPUT); Serial.begin(9600); >void loop() < // значение напряжения с потенциометра int rotation; // значение яркости int brightness; // считываем напряжение с потенциометра от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(potPin); // в brightness записываем полученное ранее значение rotation // делённое на 4. Дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation / 4; // выдаём результат на светодиод analogWrite(ledPin, brightness); // выводим результат в Serial Monitor Serial.println(brightness); delay(1); // задержка для стабильности >Практически все инструкции вам знакомы. Тут нужно уяснить момент, что яркость светодиода управляется нашим кодом, а не подачей напряжения через потенциометр. Мы считываем показания потенциометра, как в первом варианте и переводим получаемые значения в диапазон от 0 до 255. Затем воспроизводим старый пример с плавной регулировкой светодиода и подаём ему нужные значения. Теперь при вращении ручки потенциометра мы одновременно управляем степенью накала светодиода. Напомню, что светодиод следует подключить к портам с тильдой, например, ~9
03.Analog: AnalogInput
Небольшая модификация примера с миганием светодиода. Частота мигания будет зависеть от показаний потенциометра. Можно использовать встроенный светодиод или установить свой. Общая схема остаётся как у первого примера.
int sensorPin = A0; // аналоговый вывод A0 для потенциометра int ledPin = 13; // вывод для светодиода int sensorValue = 0; // значение, поступаемое от потенциометра void setup() < // устанавливаем режим для светодиода pinMode(ledPin, OUTPUT); >void loop() < // считываем показание с потенциометра sensorValue = analogRead(sensorPin); // включаем светодиод digitalWrite(ledPin, HIGH); // делаем задержку на значение от потенциометра в мсек delay(sensorValue); // выключаем светодиод digitalWrite(ledPin, LOW); // делаем задержку на значение от потенциометра в мсек delay(sensorValue); >Получая показания от потенциометра в интервале 0-1023 мы регулируем задержку между миганием светодиода в интервале от 0 до 1.023 секунд.
03.Analog: AnalogInOutSerial
Считываем данные с потенциометра и распределяем их в интервале от 0 до 255 с помощью функции map(). Данный интервал удобно использовать для выводов с PWM (ШИМ). Применим получаемые значения для управления яркостью светодиода, а также будем выводить информацию в Serial Monitor.

const int analogInPin = A0; // потенциометр к A0 const int analogOutPin = 9; // светодиод на выводе 9 int sensorValue = 0; // значения от потенциометра int outputValue = 0; // значения для PWM void setup() < Serial.begin(9600); >void loop() < // считываем данные из потенциометра sensorValue = analogRead(analogInPin); // распределяем данные из интервала 0-1023 в интервал 0-255 outputValue = map(sensorValue, 0, 1023, 0, 255); // подаём сигнал на светодиод: analogWrite(analogOutPin, outputValue); // печатаем результаты в Serial Monitor Serial.print("sensor = "); Serial.print(sensorValue); Serial.print("\t output img/analog2.png" alt="Analog">03.Analog: Smoothing
Если показания аналогового датчика "прыгают", то имеет смысл вычислить среднее значение за определённый промежуток времени и результат выдавать на экран. Таким образом мы получим более плавные значения.
Для демонстрации можно использовать потенциометр, хотя он выдаёт обычно нормальные данные, но нам важно узнать принцип.
Схема обычная, берём из примеров выше.

// число показаний для получения среднего значения (подбирается индивидуально) const int numReadings = 10; int readings[numReadings]; // массив данных от аналогового вывода int readIndex = 0; // текущий индекс int total = 0; // общее значение int average = 0; // среднее значение int inputPin = A0; // Аналоговый вывод А0 void setup() < Serial.begin(9600); // заполняем массив из 10 элементов нулями for (int thisReading = 0; thisReading < numReadings; thisReading++) < readings[thisReading] = 0; >> void loop() < // вычитаем значение total = total - readings[readIndex]; // считываем с датчика readings[readIndex] = analogRead(inputPin); // добавляем полученное значение total = total + readings[readIndex]; // переходим на следующую позицию в массиве readIndex = readIndex + 1; // если достигли конца массива. if (readIndex >= numReadings) < // . возвращаемся в начало: readIndex = 0; >// подсчитываем среднее значение average = total / numReadings; // посылаем данные на компьютер Serial.println(average); delay(1); // небольшая задержка для стабильности >05.Control: IfStatementConditional
В примере File | Examples | 05.Control | IfStatementConditional рассматривается случай, когда показания достигают определённой величины. При достижении заданного порога включается светодиод. Урок знакомит новичка с оператором условия if (Если).
Схема без изменений (см. рисунки выше). Среднюю ножку потенциометра соединяем с аналоговым выводом A0, остальные две ножки соединяем с питанием 5В и землёй. При желании установите внешний светодиод на цифровой вывод 13 (можно обойтись встроенным светодиодом).
const int analogPin = A0; // аналоговый вывод для потенциометра const int ledPin = 13; // цифровой вывод для светодиода const int threshold = 400; // произвольный порог для показаний потенциометра void setup() < pinMode(ledPin, OUTPUT); Serial.begin(9600); >void loop() < // считываем данные с потенциометра int analogValue = analogRead(analogPin); // Если показания выше чем заданный порог, то включаем светодиод if (analogValue >threshold) < digitalWrite(ledPin, HIGH); >else < digitalWrite(ledPin, LOW); // иначе держим светодиод выключенным >// выводим показания на Serial monitor Serial.println(analogValue); delay(1); // задержка для стабильности >