ESP8266 NodeMCU ADC


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 підключаються на порт 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

Та мінімальні і максимальні значення

Інтерфейс готовий. Тепер крутимо ручку потенціометра і маємо показники напруги у вигляді графіка.

Бажаю успіхів.

Дивись також:

ESP8266
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви