3. Kdo jsme…
Adam
‒ Bastlíř
‒ Programátor
‒ Správce projektu
MacGyver
Vojta
‒ Hračička
‒ Správce projektu
MacGyver
5. … a co vám přinášíme
• MQTT – Protože bez IoT by to dnes nebylo cool & in
– Co to je, jak to funguje a jak to použít
– Demo
• ESP8266 – HW
– Specifikace, zajímavosti, zapojení
– Demo (ošmatej si sám)
• ESP8266 – The easy way
– AT, Lua, uPy, Arduino, …
– Demo
• ESP8266 – Pro opravdové muže vývojáře
– SDK
– MQTT klient demo
7. MQTT
• Pub-Sub
• Broker x Client
– Publikace zprávy s předmětem (topic)
– Odebírání všech zpráv s daným předmětem
– Obsah zprávy je TXT
• Malé datové nároky
• Postavené nad TCP/IP
11. Quality of Service
• Co se stane se zprávou v případě poruchy:
QoS ⓿ … nemusí být doručena vůbec
QoS ❶ … může být doručena vícekrát
QoS ❷ … bude doručena právě jednou
12. Retain
• Příznak trvalé zprávy
• Broker si ji zapamatuje
• První co dostanu po sub
• Je možné smazat zasláním null zprávy
13. „Poslední vůle“ (will)
• Co se stane, když mě někdo zabije odpojí
• Zpráva, kterou broker zašle při nečekaném
odpojení klienta
• will-topic
• will-payload
• will-qos
• will-retain
15. Node Red
• Grafický jazyk + runtime
• Tok zpráv od vstupu do výstupu
– API, HW, online service
• Implementace v node.js
• http://nodered.org/
• https://learn.adafruit.com/raspberry-pi-hosting-node-red/what-is-node-red
20. ESP8266
• Vyžaduje 3,3 V napájení
• GPIO jsou 5 V tolerantní
• Při příjmu odběr 60-62 mA
• Při vysílání až 215 mA
21. CPU
• 80 MHz
• 96 kB data RAM
• 64 kB instuction ROM (bootloader od výrobce)
• 64 kB instruction RAM (cache pro SPI flash)
• 4 sleep módy
22. CPU
• Boot módy
• Na daných pinech nutný PullUp
MTDO GPIO0 GPIO2 Mode Description
L L H UART Download code from UART
L H H Flash Boot from SPI Flash
H x x SDIO Boot from SD-card
32. Jak s modulem komunikovat
• Sériová linka
– Bootloader má 76923 Bd
– Aplikace typicky 9600 nebo 115200 Bd
• Ale co dál…
– AT
– Terminál (Lua, uPy, Frankenstein)
– Programování (Arduino, C SDK)
33. AT příkazy
• Je tam od výroby
• Pokud máte svůj MCU
< AT+CWMODE=1 -- Nastaví Clinet mode
> OK
< AT+CWLAP -- Seznam AP
> +CWLAP:(0,"WiFi",-91,"ac:a3:1e:d1:c7:e0",1)
< AT+CWJAP="WiFi","heslo" -- Připojit k AP
> OK
…
34. Lua
• FW s interpretrem vyššího jazyka
• V současnosti nejpropracovanější
• Dva projekty:
– Čistý interpret
https://github.com/nodemcu/nodemcu-firmware
– Podpora cloudu
http://nodelua.org/
• IDE ESPlorer
http://esp8266.ru/esplorer/
35. µPython
• Silně ve vývoji!
• Aktuálně v3.4.0
• Velký potenciál…
https://github.com/micropython/micropython/tree/master/esp8266
36. Frankenstein
• FW pro „*nix guys“
• Klasický terminál (ala busybox, cisco, XPort)
• Musí se kompilovat (make menuconfig && make)
https://github.com/nekromant/esp8266-frankenstein
37. Arduino IDE
• Kdo by neznal Arduino
• Port Arduino knihoven pod ESP8266 SDK
• Včetně podpory z Arduino IDE
http://www.arduinesp.com/
41. Co nabízí
• Vlákna
• Časovače
• Práci s WiFi
• SPI read, write
• TCP/UDP stack
• JSON
• GPIO, UART, PWM, I2C
42. Sekce paměti
• .text – Program v IRAM (max 32Kb)
• .irom0.text – Program ve SPI FLASH (ICACHE)
• .data – Data v DRAM (inicializované)
• .bss – Data v DRAM (neinicializované)
• .rodata – Read only Data v DRAM
43. ESP8266 SDK - sestavení
• Vyžaduje GNU/POSIX
• Pro ubuntu je nutné instalovat:
make unrar autoconf automake libtool gcc g++ gperf flex bison texinfo gawk
ncurses-dev libexpat-dev python sed
• Poté jen spustit kompilaci:
make STANDALONE=y
44. Vytvoření binárek
• Program je potřeba rozdělit
• .text zapisujeme na adresu 0x00000
• .irom0.text podle Linker scriptu (většinou 0x40000)
• Můžeme použít nástroj esptool:
./esptool.py elf2image app.elf
45. Upload firmware
• Za pomoci UARTu
• Nutný bootloader mód
• Lze využít naříklad esptool
./esptool.py -p /dev/ttyS0 write_flash 0x00000 app-0x00000.bin 0x40000 app-0x40000.bin
/esptool.py --port /dev/ttzS0 write_flash 0x00..
Connecting...
Erasing flash...
Writing at 0x00009400... (100 %)
Erasing flash...
Writing at 0x00070800... (100 %)
Leaving...
48. Časovač
LOCAL volatile os_timer_t some_timer;
LOCAL void ICACHE_FLASH_ATTR timerCallback(void *arg){
// periodicky spouštěný kód
}
LOCAL void ICACHE_FLASH_ATTR init(){
os_timer_disarm(&some_timer);
os_timer_setfn(&some_timer, (os_timer_func_t *) timerCallback, NULL);
os_timer_arm(&some_timer, 2500, 1);
}
49. Vlákna
#define MQTT_TASK_PRIO 0
#define MQTT_TASK_QUEUE_SIZE 1
LOCAL os_event_t procTaskQueue[TASK_QUEUE_SIZE];
LOCAL void ICACHE_FLASH_ATTR ThreadTask(os_event_t *e){
os_delay_us(1000); // prostor pro váš kód
system_os_post(MQTT_TASK_PRIO, 0, 0);
}
LOCAL void ICACHE_FLASH_ATTR user_init(){
system_os_task(ThreadTask, TASK_PRIO, procTaskQueue, TASK_QUEUE_SIZE);
system_os_post(MQTT_TASK_PRIO, 0, 0);
}
50. GPIO
LOCAL void ICACHE_FLASH_ATTR user_init(){
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); // set mapping to GPIO2
GPIO_OUTPUT_SET(2, 1); // set GPIO2 to OUTPUT and Log1
os_delay_us(250000);
GPIO_OUTPUT_SET(2, 0); // set GPIO2 to OUTPUT and Log0
os_delay_us(250000);
GPIO_DIS_OUTPUT(2); // GPIO2 to INPUT
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U); // enable Pullup on GPIO2
if(GPIO_INPUT_GET(2) == 1){ // is GPIO2 set?
os_printf("uprn");
}
}
51. TCP server
LOCAL void ICACHE_FLASH_ATTR webserver_listen(void *arg) {
struct espconn *pesp_conn = arg;
espconn_regist_recvcb(pesp_conn, webserver_recv); // callback to recv function
espconn_regist_reconcb(pesp_conn, webserver_recon); // callback on reconnection start function
espconn_regist_disconcb(pesp_conn, webserver_discon); // callback on disconnected function
}
LOCAL void ICACHE_FLASH_ATTR user_init(){
LOCAL struct espconn esp_conn;
LOCAL esp_tcp esptcp;
esp_conn.type = ESPCONN_TCP;
esp_conn.state = ESPCONN_NONE;
esp_conn.proto.tcp = &esptcp;
esp_conn.proto.tcp->local_port = 80;
espconn_regist_connectcb(&esp_conn, webserver_listen);
//#define SERVER_SSL_ENABLE
#ifdef SERVER_SSL_ENABLE
espconn_secure_accept(&esp_conn);
#else
espconn_accept(&esp_conn);
#endif
}