На официальном сайтекачаем прошивку и прошиваем модуль, для 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
СпойлерПоказать
Код: Выделить всё
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)
wait
io(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 и подпрограммы - обработчики этих кнопок
СпойлерПоказать
Код: Выделить всё
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()
wait
СпойлерПоказать
Код: Выделить всё
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"))
wait
http://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, получаем следующий код
СпойлерПоказать
Код: Выделить всё
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()
wait
http://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 модуль не загружается.