ESP8266 NodeMCU АЦП


16.05.2017

ESP8266 имеет только один канал аналого-цифрового преобразователя (ADC0). АЦП 10-битный. Диапазон измеряемых напряжений 0..1 Вольт. Обратите внимание, на плате NodeMCU может быть впаян резистивный делитель напряжения. В этом случае на вход платы (A0) можно подавать от 0 до 3.3 В.

При считывании значения с АЦП получаем число в диапазоне от 0 до 1023. Если получили 1024 - это означает, что напряжение на входе ESP8266 превысило допустимый максимум (1 Вольт). ADC может работать в одном из двух режимов. Режим adc.INIT_ADC - измеряет напряжение на входе АDC0 (A0). Режим adc.INIT_VDD33 - измеряет системное напряжение (system voltage). Режим устанавливается командой adc.force_init_mode (mode_value). После этого надо перезагрузить NodeMCU. Только после перезагрузки произойдет смена режима. Считывания в режиме adc.INIT_ADC:


adc.read(0)
У ESP8266 только один АЦП канал, поэтому параметр всегда 0. Считывания в режиме adc.INIT_VDD33:

adc.readvdd33(0)
Пример скрипта:

-- Простая инициализация
adc.force_init_mode(adc.INIT_ADC)
print(adc.read(0))

- Инициализация с проверкой необходимости перезагрузки
if adc.force_init_mode(adc.INIT_VDD33)
then
  node.restart()
  return
end
print("System voltage (mV):", adc.readvdd33(0))

Подключим потенциометр как показано на схеме:

И протестируем работу следующим скриптом:


-- ADC Init
adc.force_init_mode(adc.INIT_ADC)
function timer_do ()
  print(`adc `..adc.read(0)..``)
end
-- Start timer
tmr.register(0, 1000, tmr.ALARM_AUTO, timer_do)
tmr.start(0)
В этом скрипте мы использовали таймер. Подробно работу таймеров рассмотрим позже. В примере таймер запускает функцию timer_do каждую секунду. Функция timer_do выводит считанные с АЦП данные. Следующий пример скрипта, который отправляет данные (10 раз в секунду), когда к ESP8266 подключаются к TCP порту 333.

--WiFi AP Settup
wifi.setmode(wifi.STATIONAP)
cfg={}
cfg.ssid="ESPWIFI"
cfg.pwd="1234567890"
wifi.ap.config(cfg)
-- ADC Init
adc.force_init_mode(adc.INIT_ADC)
function timer_do()
  if socket then
    socket:send(`adc `..adc.read(0)..``)
  end
end
-- Start timer
tmr.register(0, 100, tmr.ALARM_AUTO, timer_do)
tmr.start(0)
--Create Server
sv=net.createServer(net.TCP)
socket=nil
if sv then
  sv:listen(333, function(conn)
      conn:on("receive", receiver)
      conn:on("connection", function(sck, c) socket=sck end)
      conn:on("reconnection", function(sck, c) socket=sck end)
      conn:on("disconnection", function(sck, c) socket=nil end)
    end)
end

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

Если подключимся любимой терминальной программой, например JuiceSSH к ESP8266 (IP: 192.168.4.1 Port: 333) получим следующую картину:

Как и в предыдущих примерах мы сделаем интерфейс в программе ReboRemoFree для отображения данных в виде графика. Нажимаем на свободном пространстве нового интерфейса и в меню выбираем plot.

Задаем ему ID:

Указываем минимальное и максимальное значение:

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

Желаю успехов.

Смотри также:

Коментарі:

Додати коментар

* - обов'язкові поля

Архіви