На официальном сайтекачаем прошивку и прошиваем модуль, для Windows сделан прошивальщик, для Linux имеются bin файлы, но прошив их в Linux мне не удалось запустить модуль, поэтому пришлось искать машину с Windows и прошивать Windows прошивальщиком.
Запустив модуль первый раз он работает в режиме точки доступа, подключаемся к точке доступа ESP и заходим по адресу http://192.168.4.1, увидим главную страницу
на странице SETTINGS настраиваем параметры подключения к нашей точке доступа. если Вы установите галочку Menu bar Disable то меню не будет отображаться на главной странице, если установите галочку Run default.bas at startup то будет запускаться программа на Basic из файла default.bas
Файлы можно посмотреть на странице FILE MANAGER, отредактировать файл default.bas можно на странице EDIT
Its work!
Заходим на страницу EDIT и пишем в поле кода:
Код: Выделить всё
print "I'ts work!" Управление GPIO
Управлять GPIO можно разными способами, в описанном примере мы будем управлять GPIO с помощью кнопок.
Управление состоянием GPIO осуществляется командой io которая имеет следующий сиснаксис
Код: Выделить всё
io(РЕЖИМ,GPIO_НОМЕР,СОСТОЯНИЕ) po - режим выхода СОСТОЯНИЕ может принимать значение 0 или 1
pwo - режим PWM, СОСТОЯНИЕ может принимать значение от 0 до 1023
servo - режим управления сервоприводом, СОСТОЯНИЕ от 0 до 180
таким образом команда подать на GPIO12 логическую единицу будет выглядеть следующим образом
Код: Выделить всё
io(po,12,1) кнопка добавляется командой
Код: Выделить всё
button ИМЯ_КНОПКИ, МЕТКАПрограмма будет начинаться с заголовка и содержать 4 кнопки.
Код: Выделить всё
print "<b>ESP8266</b></br>"
button "GPIO12 on", [1]
button "GPIO12 off", [2]
button "GPIO13 on", [3]
button "GPIO13 off", [4]
waitно кнопки ещё ничего не делают, чтобы они делали нам надо написать 4 подпрограммы в которых будет выполняться код включения/выключения GPIO, весь код будет выглядеть так:
Код: Выделить всё
print "<b>ESP8266</b></br>"
button "GPIO12 on", [1]
button "GPIO12 off", [2]
button "GPIO13 on", [3]
button "GPIO13 off", [4]
wait
[1]
io(po,12,1)
wait
[2]
io(po,12,0)
wait
[3]
io(po,13,1)
wait
[4]
io(po,13,0)
waitНо не удобно управлять одним GPIO двумя кнопками, поэтому состояние GPIO мы зададим в переменной и будем использовать логическое исключение оператор XOR и перед переключением выхода мы будем определять состояние выхода командой
Код: Выделить всё
io(laststat,GPIO_НОМЕР) Код: Выделить всё
print "<b>ESP8266</b></br>"
button "GPIO12", [1]
button "GPIO13", [2]
wait
[1]
gpio = io(laststat,12)
gpio = gpio xor 1
io(po,12,gpio)
wait
[2]
gpio = io(laststat,13)
gpio = gpio xor 1
io(po,13,gpio)
waitКод для управления всеми GPIO
SPOILERSPOILER_SHOW
Код: Выделить всё
print "<b>ESP8266</b></br>"
button "GPIO0", [0]
button "GPIO1", [1]
button "GPIO2", [2]
button "GPIO3", [3]
button "GPIO4", [4]
button "GPIO5", [5]
button "GPIO12", [12]
button "GPIO13", [13]
button "GPIO14", [14]
button "GPIO15", [15]
wait
[0]
gpio = io(laststat,0)
gpio = gpio xor 1
io(po,0,gpio)
wait
[1]
gpio = io(laststat,1)
gpio = gpio xor 1
io(po,1,gpio)
wait
[2]
gpio = io(laststat,2)
gpio = gpio xor 1
io(po,2,gpio)
wait
[3]
gpio = io(laststat,3)
gpio = gpio xor 1
io(po,3,gpio)
wait
[4]
gpio = io(laststat,4)
gpio = gpio xor 1
io(po,4,gpio)
wait
[5]
gpio = io(laststat,5)
gpio = gpio xor 1
io(po,5,gpio)
wait
[12]
gpio = io(laststat,12)
gpio = gpio xor 1
io(po,12,gpio)
wait
[13]
gpio = io(laststat,13)
gpio = gpio xor 1
io(po,13,gpio)
wait
[14]
gpio = io(laststat,14)
gpio = gpio xor 1
io(po,14,gpio)
wait
[15]
gpio = io(laststat,15)
gpio = gpio xor 1
io(po,15,gpio)
waitio(po,GPIO_НОМЕР,1)
иначе при первом нажатии реле не включится, поскольку состояние измениться на 1.
работа с i2c шиной на GPIO0 и GPIO2 соответственно SDA и SCL, но можно переназначить GPIO командой
Код: Выделить всё
i2c.setup({SDA}, {SCL}) Код: Выделить всё
for address = 1 to 127
i2c.begin(address)
stat = i2c.end()
if stat < 1 then
' print stat
wprint "I2C device: 0x" & hex(address)
wprint " - > " & address
wprint " <br>"
endif
next
waitТеперь добавим кнопки для включения/выключения GPIO и подпрограммы - обработчики этих кнопок
SPOILERSPOILER_SHOW
Код: Выделить всё
let address = 32 'PCF8574 I2C Address
i2c.begin(address)
ss = 0 xor 255
i2c.write(ss)
i2c.end()
button "1", [p1]
button "2", [p2]
button "3", [p3]
button "4", [p4]
button "5", [p5]
button "6", [p6]
button "7", [p7]
button "8", [p8]
button "OFF", [p0]
wait
[p0]
i2c.begin(address)
ss = 0 xor 255
i2c.write(ss)
i2c.end()
wait
[p1]
i2c.begin(address)
ss = ss xor 1
i2c.write(ss)
i2c.end()
wait
[p2]
i2c.begin(address)
ss = ss xor 2
i2c.write(ss)
i2c.end()
wait
[p3]
i2c.begin(address)
ss = ss xor 4
i2c.write(ss)
i2c.end()
wait
[p4]
i2c.begin(address)
ss = ss xor 8
i2c.write(ss)
i2c.end()
wait
[p5]
i2c.begin(address)
ss = ss xor 16
i2c.write(ss)
i2c.end()
wait
[p6]
i2c.begin(address)
ss = ss xor 32
i2c.write(ss)
i2c.end()
wait
[p7]
i2c.begin(address)
ss = ss xor 64
i2c.write(ss)
i2c.end()
wait
[p8]
i2c.begin(address)
ss = ss xor 128
i2c.write(ss)
i2c.end()
waitSPOILERSPOILER_SHOW
Код: Выделить всё
print "<b>ESP8266</b><br>"
for address = 1 to 127
i2c.begin(address)
stat = i2c.end()
if stat < 1 then
' print stat
wprint "I2C device: 0x" & hex(address)
wprint " - > " & address
wprint " <br>"
endif
next
let address = 32 'PCF8574 I2C Address
let address2 = 33 'PCF8574 I2C Address
i2c.begin(address)
ss = 0 xor 255
i2c.write(ss)
i2c.end()
i2c.begin(address2)
ss2 = 0 xor 255
i2c.write(ss2)
i2c.end()
button "1", [p1]
button "2", [p2]
button "3", [p3]
button "4", [p4]
button "5", [p5]
button "6", [p6]
button "7", [p7]
button "8", [p8]
button "9", [p9]
button "10", [p10]
button "11", [p11]
button "12", [p12]
button "13", [p13]
button "14", [p14]
button "15", [p15]
button "16", [p16]
print ""
button "OFF", [p0]
wait
[p0]
i2c.begin(address)
ss = 0 xor 255
i2c.write(ss)
i2c.end()
i2c.begin(address2)
ss2 = 0 xor 255
i2c.write(ss2)
i2c.end()
wait
[p1]
i2c.begin(address)
ss = ss xor 1
i2c.write(ss)
i2c.end()
wait
[p2]
i2c.begin(address)
ss = ss xor 2
i2c.write(ss)
i2c.end()
wait
[p3]
i2c.begin(address)
ss = ss xor 4
i2c.write(ss)
i2c.end()
wait
[p4]
i2c.begin(address)
ss = ss xor 8
i2c.write(ss)
i2c.end()
wait
[p5]
i2c.begin(address)
ss = ss xor 16
i2c.write(ss)
i2c.end()
wait
[p6]
i2c.begin(address)
ss = ss xor 32
i2c.write(ss)
i2c.end()
wait
[p7]
i2c.begin(address)
ss = ss xor 64
i2c.write(ss)
i2c.end()
wait
[p8]
i2c.begin(address)
ss = ss xor 128
i2c.write(ss)
i2c.end()
wait
[p9]
i2c.begin(address2)
ss2 = ss2 xor 1
i2c.write(ss2)
i2c.end()
wait
[p10]
i2c.begin(address2)
ss2 = ss2 xor 2
i2c.write(ss2)
i2c.end()
wait
[p11]
i2c.begin(address2)
ss2 = ss2 xor 4
i2c.write(ss2)
i2c.end()
wait
[p12]
i2c.begin(address2)
ss2 = ss2 xor 8
i2c.write(ss2)
i2c.end()
wait
[p13]
i2c.begin(address2)
ss2 = ss2 xor 16
i2c.write(ss2)
i2c.end()
wait
[p14]
i2c.begin(address2)
ss2 = ss2 xor 32
i2c.write(ss2)
i2c.end()
wait
[p15]
i2c.begin(address2)
ss2 = ss2 xor 64
i2c.write(ss2)
i2c.end()
wait
[p16]
i2c.begin(address2)
ss2 = ss2 xor 128
i2c.write(ss2)
i2c.end()
waitУправление с помощью http запросов.
Для принятия модулем данных используется команда
Код: Выделить всё
msgbranch МЕТКАКод обработки будет выглядеть так
Код: Выделить всё
print "<b>ESP8266</b></br>"
msgbranch [mybranch]
wait
[mybranch]
pinNo = val(msgget("pin"))
waithttp://192.168.4.1/msg?pin=2
для опроса состояния GPIO мы воспользуемся командой
Код: Выделить всё
io(laststat,GPIO_НОМЕР) Код: Выделить всё
print "<b>ESP8266</b></br>"
msgbranch [mybranch]
wait
[mybranch]
pinNo = val(msgget("pin"))
gpio = io(laststat,pinNo)
gpio = gpio xor 1
io(po,pinNo,gpio)
waitТеперь совместим все программы, управление кнопками, управление PCF8574 и управление по http, получаем следующий код
SPOILERSPOILER_SHOW
Код: Выделить всё
print "<b>ESP8266</b><br>"
msgbranch [mybranch]
let address = 32 'PCF8574 I2C Address
let address2 = 33 'PCF8574 I2C Address
i2c.begin(address)
ss = 0 xor 255
i2c.write(ss)
i2c.end()
i2c.begin(address2)
ss2 = 0 xor 255
i2c.write(ss2)
i2c.end()
'у меня инвертированные реле поэтому на всех выходах делаем логическую единицу
io(po,1,1)
io(po,1,3)
io(po,1,4)
io(po,1,5)
io(po,1,12)
io(po,1,13)
io(po,1,14)
io(po,1,15)
'кнопки
button "GPIO1", [1]
button "GPIO3", [3]
button "GPIO4", [4]
button "GPIO5", [5]
button "GPIO12", [12]
button "GPIO13", [13]
button "GPIO14", [14]
button "1", [p1]
button "2", [p2]
button "3", [p3]
button "4", [p4]
button "5", [p5]
button "6", [p6]
button "7", [p7]
button "8", [p8]
button "9", [p9]
button "10", [p10]
button "11", [p11]
button "12", [p12]
button "13", [p13]
button "14", [p14]
button "15", [p15]
button "16", [p16]
print ""
button "OFF", [p0]
wait
[mybranch]
pinNo = msgget("pin")
if pinNo = "1" then goto [1]
if pinNo = "2" then goto [3]
if pinNo = "4" then goto [4]
if pinNo = "5" then goto [5]
if pinNo = "12" then goto [12]
if pinNo = "13" then goto [13]
if pinNo = "14" then goto [14]
if pinNo = "p1" then goto [p1]
if pinNo = "p2" then goto [p2]
if pinNo = "p3" then goto [p3]
if pinNo = "p4" then goto [p4]
if pinNo = "p5" then goto [p5]
if pinNo = "p6" then goto [p6]
if pinNo = "p7" then goto [p7]
if pinNo = "p8" then goto [p8]
if pinNo = "p9" then goto [p9]
if pinNo = "p10" then goto [p10]
if pinNo = "p11" then goto [p11]
if pinNo = "p12" then goto [p12]
if pinNo = "p13" then goto [p13]
if pinNo = "p14" then goto [p14]
if pinNo = "p15" then goto [p15]
if pinNo = "p16" then goto [p16]
wait
[1]
gpio = io(laststat,1)
gpio = gpio xor 1
io(po,1,gpio)
wait
[3]
gpio = io(laststat,3)
gpio = gpio xor 1
io(po,3,gpio)
wait
[4]
gpio = io(laststat,4)
gpio = gpio xor 1
io(po,4,gpio)
wait
[5]
gpio = io(laststat,5)
gpio = gpio xor 1
io(po,5,gpio)
wait
[12]
gpio = io(laststat,12)
gpio = gpio xor 1
io(po,12,gpio)
wait
[13]
gpio = io(laststat,13)
gpio = gpio xor 1
io(po,13,gpio)
wait
[14]
gpio = io(laststat,14)
gpio = gpio xor 1
io(po,14,gpio)
wait
[p0]
i2c.begin(address)
ss = 0 xor 255
i2c.write(ss)
i2c.end()
i2c.begin(address2)
ss2 = 0 xor 255
i2c.write(ss2)
i2c.end()
wait
[p1]
i2c.begin(address)
ss = ss xor 1
i2c.write(ss)
i2c.end()
wait
[p2]
i2c.begin(address)
ss = ss xor 2
i2c.write(ss)
i2c.end()
wait
[p3]
i2c.begin(address)
ss = ss xor 4
i2c.write(ss)
i2c.end()
wait
[p4]
i2c.begin(address)
ss = ss xor 8
i2c.write(ss)
i2c.end()
wait
[p5]
i2c.begin(address)
ss = ss xor 16
i2c.write(ss)
i2c.end()
wait
[p6]
i2c.begin(address)
ss = ss xor 32
i2c.write(ss)
i2c.end()
wait
[p7]
i2c.begin(address)
ss = ss xor 64
i2c.write(ss)
i2c.end()
wait
[p8]
i2c.begin(address)
ss = ss xor 128
i2c.write(ss)
i2c.end()
wait
[p9]
i2c.begin(address2)
ss2 = ss2 xor 1
i2c.write(ss2)
i2c.end()
wait
[p10]
i2c.begin(address2)
ss2 = ss2 xor 2
i2c.write(ss2)
i2c.end()
wait
[p11]
i2c.begin(address2)
ss2 = ss2 xor 4
i2c.write(ss2)
i2c.end()
wait
[p12]
i2c.begin(address2)
ss2 = ss2 xor 8
i2c.write(ss2)
i2c.end()
wait
[p13]
i2c.begin(address2)
ss2 = ss2 xor 16
i2c.write(ss2)
i2c.end()
wait
[p14]
i2c.begin(address2)
ss2 = ss2 xor 32
i2c.write(ss2)
i2c.end()
wait
[p15]
i2c.begin(address2)
ss2 = ss2 xor 64
i2c.write(ss2)
i2c.end()
wait
[p16]
i2c.begin(address2)
ss2 = ss2 xor 128
i2c.write(ss2)
i2c.end()
waithttp://192.168.1.172/msg?pin=НОМЕР_ПИНА
где НОМЕР_ПИНА - номер GPIO модуля (1,3,4,5,12,13,14,15) или номер вывода на PCF8574 (p1,p2,p3...p16)
Поскольку GPIO0 и GPIO2 заняты шиной i2c по которой подключены PCF8574 то мы их исключили, так же исключен GPIO15 поскольку при подключении инверсированного реле к GPIO15 модуль не загружается.