сайт для палких паяльників

3. ESP8266 NodeMCU. АЦП
(на русском языке)

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)..'\n')
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)..'\n')
    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 до ESP8622 (IP: 192.168.4.1 Port: 333)отримаємо таку картину:

Як і у попередніх прикладах ми зробимо інтерфейс у програмі ReboRemoFree для відображення даних у вигляді графіку. Натискаємо на вільному просторі нового інтерфейсу і в меню обираємо plot.

Задаємо йому ID

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

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

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

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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

 
Translate
Архіви

© 2011-2018 Андрій Корягін, Кременчук - Київ, Україна