ESP8266:Примеры/Считывание аналоговых данных через контакт ADC на ESP8266

Материал из Онлайн справочника
Версия от 12:59, 18 июня 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Считывание аналоговых данных через контакт ADC на ESP8266[1]

Модули ESP-12E и ESP-07 имеют контакт ADC. Доступ к нему получить очень просто и благодаря ему ESP-12E и ESP-07 могут считывать аналоговые значения от устройств вроде датчиков температуры, потенциометров, датчиков света и т.д.

Перед тем, как продолжить, советую пройти эти руководства:

Справочная информация

Основы программирования на Lua

Это скриптовый язык программирования, написанный на C. Разработка этого проекта началась в 1993 году силами Роберту Иерузалимски, Луиша Энрике де Фигейреду и Валдемара Келе, работавшими тогда в подразделении Tecgraf при Католическом университете Рио-де-Жанейро.

Более подробно об этом языке программирования можно почитать в «Википедии».

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

Переменные

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

  • Глобальные переменные. Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные).
pin = 3
test = "It works!"
  • Локальные переменные. Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией.
local pin = 3
local test = "It works!"
  • Поля таблиц. Это особый тип переменных, в которых может храниться все, за исключением «nil» (мы это затрагивать не будем).
Примечание

Lua – это язык, чувствительный к регистру. Поэтому переменная «PIN» – это не то же самое, что «Pin» или «pin».

Типы данных (типы значений)

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

В таблице ниже показаны типы данных для значений в языке Lua.

Тип значения Описание
Строка (string) Массив символов
Число (number) Действительное (двойной точности с плавающей запятой) число
Булево значение (boolean) Значение «true» или «false». Как правило, используется для проверки выполнения условий
Функция (function) Функция, написанная на Lua
Неопределенное значение (nil) В такой переменной не хранится никаких данных
Таблица (table), пользовательские данные (userdata) и поток (thread) Эти три типа данных мы затрагивать не будем

Вот примеры некоторых из этих типов значений:

print(type("Hello world!")) - строка
print(type(7))              -- число
print(type(true))           -- булево значение
print(type(print))          -- функция
print(type(nil))            -- неопределенное значение
Примечание

Работая с ESP8266 и прошивкой NodeMCU, вы изредка будете встречать тип данных «nil». Это будет значить лишь, что такая переменная не определена. Также, если вы хотите удалить какое-то значение в какой-то переменной, просто присвойте ей значение «nil».

Комментарии

Комментарии – это просто текст, в котором программист объясняет, как работает его код. Если какой-то фрагмент кода помечен как комментарий, то ESP-модуль проигнорирует его и не будет обрабатывать. Комментарии начинаются с двух тире («--»). Вот два типа комментариев:

  • Однострочные комментарии:
print("Hello World!") - комментарий в одну строчку
  • Многострочные комментарии:
--[[
print("Hello World!") – это многострочный комментарий
--]]

Операторы

Оператор – это символ, который говорит интерпретатору выполнить определенное математическое или логическое действие. В язык Lua встроено много операторов разных типов:

  • Арифметические операторы;
  • Операторы сравнения;
  • Логические операторы;
  • Прочие операторы;

Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: «А», в которой хранится значение «1», и «B», в которой хранится значение «2».

A = 1
B = 2
Арифметические операторы
Оператор Пример Результат
+ A + B 3
- A - B -1
* A * B 2
/ B / A 2
% B % A 0
^ B^2 4
- -A -1
Операторы сравнения
Оператор Пример Результат
== (A == B) false
~= (A ~= B) true
> (A > B) false
< (A < B) true
>= (A >= B) false
<= (A <= B) true
Логические операторы
Оператор Пример Результат
and (и) (A and B) false
or (или) (A or B) true
not (не) !(A and B) true
Оператор конкатенации

Теперь представьте, что у нас две новые переменные:

a = "Hello!"
b = "World!"
Оператор Пример Результат
.. a..b "Hello World!"

Циклы

Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной «boolean_value» является «true».

-- цикл while
while boolean_value
do
 -- код будет выполняться, пока в «boolean_value» будет «true»
end

-- и цикл for
for min, max, increment
do
  -- код будет выполняться, пока не будет достигнуто макс. значение
end

Операторы if… else

Операторы if... else (т.е. «если... иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом:

if boolean_value then
    -- если в переменной «boolean_value» значение «true»
else 
    -- если в переменной «boolean_value» значение «false»
end

Названия этих операторов говорят сами за себя. Если выполнено условие «boolean_value=true», то программа выполнит код, идущий после «if». Но если условием является «boolean_value=false», то программа выполнит код, идущий после «else».

Функции

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

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

function displayTemperature(kelvin)
  celsius = kelvin  273.15
  print("Temperature in Celsius is: ", celsius)

  fahrenheit = (celsius*9/5+32)
  print("Temperature in Fahrenheit is: ", fahrenheit)
end

k = 294 - температура в градусах Кельвина

displayTemperature(k) - эта строчка вызывает функцию, созданную выше


Контакт ADC

Этот контакт на ESP8266 могут называть по-разному:

  • ADC (от «analog-to-digital converter», т.е. «аналогово-цифровой преобразователь»)
  • TOUT
  • Контакт 6
  • A0
  • Аналоговый контакт 0

На данный момент контакт ADC имеет 10-битное разрешение, а его диапазон для входящего напряжения составляет от 0 до 3,3 вольт (если ADC подключен к внешней цепи).

Доступ к контакту ADC на ESP8266

Доступ к этому контакту на ESP-12E получить очень просто – вам нужно всего лишь подключить к нему провод-перемычку (см. фото ниже).

Контакт A0 на модуле ESP-12E

На модуле ESP-07 к этому контакту нужно припаять провод.

Контакт A0 на модуле ESP-07

Необходимые компоненты

  • Рекомендуемый вариант – один модуль ESP-12E; альтернативный вариант – один модуль ESP-07 + один программатор FTDI
  • Одна макетная плата
  • Один резистор на 100 Ом
  • Один резистор на 220 Ом
  • Один потенциометр на 1 кОм

Запись на ESP прошивки NodeMCU

В этом проекте для считывания аналоговых данных используется прошивка NodeMCU. О том, как загрузить ее на ESP, читайте тут.

Загрузка ESPlorer IDE

Для отправки команд на ESP8266 рекомендую использовать программу ESPlorer IDE, написанную пользователем 4refr0nt. Чтобы скачать и установить ее, проделайте следующее:

  1. Загрузите отсюда ZIP-архив с программой
  2. Распакуйте архив
  3. Перейдите в главную папку
  4. Запустите файл «ESPlorer.jar»
  5. Откройте ESPlorer

О вольтовом диапазоне на контакте ADC

Согласно даташиту ESP8266, контакт ADC имеет 10-битное разрешение. Это значит, что считанное аналоговое значение будет в диапазоне от «0» до «1024».

Контакт ADC конвертирует напряжение, находящееся только в диапазоне от 0 до 3,3 вольт. Поэтому перед тем, как подавать на контакт ADC (он же A0) какое-либо напряжение, убедитесь, что используете устройство, которое выдает не более 3,3 вольт. В противном случае вам понадобится делитель напряжения:

Примечание

У ранних версий ESP контакт A0 может работать с напряжением не выше 1 вольта. Поэтому перед сборкой цепи, описанной в следующем разделе, убедитесь, что A0 на вашем модуле может работать с 3,3 вольтами.

Схема

Потенциометр подключается к ESP следующим образом:

  • Красный провод – к контакту 3.3V
  • Оранжевый провод – к контакту A0
  • Черный провод – к контакту GND

Тестирование контакта ADC (A0)

Чтобы отправлять команды при помощи ESPlorer IDE, вам нужно установить последовательное соединение между компьютером и ESP. Для этого сделайте следующее:

  1. Подключите ESP-12E или программатор FTDI к компьютеру
  2. Выставьте скорость передачи данных на 9600 бод
  3. Выберите порт, к которому подключен ESP-12E или программатор FTDI (например, COM3)
  4. Нажмите на кнопку «Open/Close»

Все элементы, необходимые для этих действий, показаны на картинке ниже красным цветом:

Затем впишите команду print(adc.read(0)) и нажмите на кнопку «Send», как показано на картинке ниже:

Вам должно вернуться значение в диапазоне от «0» до «1024». Теперь покрутите потенциометр и еще несколько раз отправьте команду print(adc.read(0)). Если регулятор потенциометра будет выставлен ближе к 0 вольт, программа напечатает что-то около «0», а если ближе к 3,3 вольт, то что-то около «1024».

См.также

Внешние ссылки