Simulando aplicação ANNEX BASIC no U-BLOX NINA W106 via WOKWI - Controlando LED via ROBLOX
O objetivo deste BLOG é como programar o U-BLOX NINA W106 com o ANNEX BASIC, para que possa acessar a INTERNET,haverá um conexão e uma requisição HTTP ao servidor THINGSPEAK e então a informação recebida (formato JSON) será tratada para extrair o field1 e então controlar o estado de um LED conectado no IO25 (GPIO IO2) do U-BLOX NINA W106 (ESP32).
A APLICAÇÃO ROBLOX (PROGRAMADO EM LUA), ALTERARÁ ESTE field1.
O LED É O VERDE (GREEN).
THINGSPEAK FARÁ A PONTE ENTRE O ROBLOX E ANNEX BASIC.
Teste de forma simulada o U-BLOX NINA W106 :) em ANNEX BASIC :)
Didn´t you understand ? Look
SOBRE A LINGUAGEM BASIC
BASIC (acrônimo para Beginner's All-purpose Symbolic Instruction Code; em português: Código de Instruções Simbólicas de Uso Geral para Principiantes) é uma linguagem de programação, criada com fins didáticos, pelos professores John George Kemeny, Thomas Eugene Kurtz e Mary Kenneth Keller em 1964 no Dartmouth College.
Basic pode ser uma opção de linguagem para se aprender lógica, uma vez que foi desenvolvida em alto nível (próxima da linguagem humana). Além da sua relativa facilidade de criar aplicações de forma simples e rápida.
BASIC também é o nome genérico dado a uma grande família de linguagens de programação derivadas do BASIC original. Provavelmente existem mais variações de BASIC do que de qualquer outra linguagem de programação.
BASIC ANNEX RDS
Best Embedded Basic Interpreter
ESP-NOW, BLE, MQTT...ÓTIMO PARA IoT
Veja o HELP do BASIC ANNEX RDS
Veja também FORUM
INTERPRETADOR?
O interpretador básico funciona através da leitura de um arquivo de script salvo no sistema de arquivamento em disco local esp.
Este é o modo padrão se nenhum SDcard externo estiver conectado ao u-BLOX NINA W106.
Além disso, o Annex32 pode usar um SDcard externo como sistema de arquivos, permitindo até 16 Gbytes de espaço em disco.
Durante a inicialização, se um SDcard externo for detectado, ele será conectado automaticamente e usado como o sistema de arquivos padrão, caso em que o sistema de arquivo interno não será usado.
Como o u-BLOX NINA W106 contém uma boa quantidade de RAM, o script do usuário é copiado do disco para uma área dedicada na memória RAM onde é executado, junto com a lista das linhas do programa, os rótulos dos ramos e a lista do usuário definido sub-rotinas ..
Isso usa mais RAM em comparação com outras abordagens, mas permite uma execução mais rápida do programa.
Outra consideração de desempenho é que o u-BLOX NINA W106 deve ser capaz de executar várias atividades em segundo plano (servidor web, servidor de arquivos, etc.), portanto, precisa de memória livre suficiente para executar tais tarefas, e essas tarefas paralelas obviamente terão um impacto no desempenho do script.
Portanto, em termos de desempenho, o interpretador não é particularmente rápido, mas deve ser rápido o suficiente para a maioria das tarefas que você pode exigir.
INTRODUÇÃO AO ANNEX BASIC
ANNEX WI-FI RDS é um poderoso interpretador de scripts para o popular módulo WI-FI ESP32 (u-BLOX NINA W106).
O módulo pode ser gerenciado com um IDE WEB dedicado e um conjunto de utilitários AnnexToolKit associado.
O ANNEX WI-FI RDS fornece as seguintes funcionalidades principais:
- Servidor web assíncrono baseado em Websockets
- Servidor web muito rápido/servidor de arquivos
- Apenas uma porta TCP necessária para http e websockets
- IDE integrado
- Pode ser programado usando seu navegador web (mesmo com um telefone/tablet)
- Pontos de interrupção, execução imediata de comandos, exibição de variáveis, passo único.
- Ajuda sensível ao contexto disponível pressionando a tecla F2
- Atualização OTA (Over the Air)
- Poderoso utilitário de faca suíça associado AnnexToolKit
- Programação de flash simplificada
- Backup/restauração (de/de arquivos, para/de zip)
FUNCIONALIDADES
Variáveis de dupla precisão de ponto flutuante
Variáveis de string com tamanho ilimitado
Matrizes multidimensionais (pontos flutuantes ou string)
Manipulação de eventos assíncronsos
Manipulação de erros
I/O em todos os pinos disponíveis, incluindo PWM/SERVO
Controladores PID
Contadores de frequência
Entrada ADC analógica
Geração de tons
Suporte para SPI e I2C
Suporte protocolos TCP e UDP para comunicações
Suporte para envio de e-mails usando servidores SSL SMTP
Suporte para comunicações AJAX
Suporte para comunicações ESP-NOW
Suporte para comunicações MQTT
Suporte para transferência de arquivos FTP
Suporte algoritmos IMU Fusion 6 DOF e 9 DOF (Madgwick e Mahony)
Forte integração com o javascript permitindo trocas entre script Básico e navegador web
Uma paleta completa de funções/comandos
Mais de 300 Comandos/Funções disponíveis
Suporte para os seguintes módulos/componentes
- Sensores de temperatura/umidade DHT11, DHT21 ou DHT22
- Sensor de temperatura DS18B20
- LCD HD44780 com módulo de interface I2C (1, 2 ou 4 linhas com 16 ou 20 chars por linha)
- Display LCD baseado no chipset ST7920 com monocromático de 128x64 pixels
- Display OLED baseado no chipset SSD1306 ou SH1106 com monocromáticos 128x64
- Display TFT baseado em chipset ILI9341 com 320x240 pixels e 16 bits cores
- Exibição TM1637 de 4 dígitos de 7 segmentos
- TM1638 8 dígitos 7 segmentos display incluindo 8 leds e 8 botões
- Exibição max7219 de 8 dígitos de 7 segmentos
- Módulos de exibição de matriz de ponto MAX7219 8x8
- Tiras led Neopixel WS2812
- Tela de matriz de pontos Neopixel WS2812 8x8
- Módulo PWM/SERVO PCA9685
- Interface infravermelha com muitos protocolos RC (transmissão e recepção)
- Módulo RTC (DS1307 ou DS3231)
- Sensor ultrassônico HC-SR04 para medição de distância
- Sensor de orientação absoluta BNO055
- BME280 Sensor combinado de umidade e pressão
- Proximidade Digital APDS9960, Luz Ambiente, RGB e Sensor de Gestos
PRIMEIROS PASSOS
- Descompacte o pacote do Annex WI-Fi Basic para uma pasta de sua escolha.
- Conecte o dispositivo ESP à porta Com serial do computador.
- Execute o AnnexToolKit.exe da pasta pai descompactada.
- Selecione o tipo de módulo, porta de comunicação e velocidade (taxa de transmissão) apropriados.
- Se o seu dispositivo ESP não for capaz de 'flash automático', inicie-o no modo de flash manualmente (gpio0 a 0v na inicialização).
- Clique no botão amarelo 'Flash Firmware + Dados' se estiver fazendo um flash pela primeira vez e siga as instruções na tela.
- Após a conclusão bem-sucedida, o dispositivo será reinicializado e executará o novo firmware.
- Conecte o wi-fi ao ESP SSID que aparecerá na lista de computadores de SSIDs Wifi disponíveis (leva alguns segundos).
- Navegue até 192.168.4.1 para abrir a janela Saída padrão e, a seguir, clique com o botão direito do mouse no botão Editor para abri-lo em uma nova guia.
Estes são os primeiros passos para começar:
Faça o download do ANNEX TOOLKIT para u-BLOX NINA W106 (ESP32), senha: annex
Abra o AnnexToolKit, selecione a Porta Serial, clique em Conectar e verifique o endereço IP mostrado na janela Serial Monitor. No exemplo foi escolhido o botão verde Flash Firmware ESP32 Only
Vendo se o boot ocorreu dentro do esperado
Neste caso, o Endereço é 192.168.1.8 porque foi pré-configurado para se conectar ao meu roteador wi-fi, caso contrário o endereço IP será padrão para 192.168.4.1
Veja como pegar IP da sua REDE (modo Station)
Procurando e se conectando no ANNEX
Acessando 198.168.4.1 (IP inicial do ANNEX)
Coloque o SSID e SENHA de seu Access Point
Obtendo o IP da sua Rede Local
Uma vez configurado, ele entrará em sua REDE
Abra uma janela do navegador da Web e selecione o endereço IP do módulo. Clique em Editor
Agora você pode simplesmente digitar seu programa e salvá-lo no disco interno.
Podemos começar com um programa muito simples:
Digite print "Hello World" na janela do editor e clique em Save as, nomeie o programa /program/test.bas e clique em Save
Você pode ver na janela Serial Monitor que o arquivo foi salvo
A ajuda sensível ao contexto on-line está disponível para qualquer comando Annex. Isso requer que o computador seja conectado ao dispositivo e à internet ao mesmo tempo. Assim, o computador precisa de 2 interfaces de rede (uma para o dispositivo e outra para internet), ou o dispositivo deve ser configurado para logon ao seu roteador wi-fi para que ele esteja na mesma sub-rede que a conexão com a internet.
Ajuda online é muito fácil de usar, se você quiser ajuda para o comando PRINT, por exemplo, basta colocar o cursor na palavra imprimir na janela de edição e pressionar a tecla F2.
Esta janela pop-up aparecerá:
Agora você pode executar o programa clicando no botão Run
Na janela Serial Monitor você verá o resultado
ESCREVENDO Hello SmartCore no TERMINAL COM A INSTRUÇÃO Print
WOKWI
Wokwi é um simulador de eletrônica online. Você pode usá-lo para simular Arduino, U-BLOX NINA W106 (ESP32) e muitas outras placas, componentes e sensores populares.
Simula várias partes (elementos Wokwi) como LEDs, shift registers, Buzzer, sensores (ultrassônico, temperatura, umidade etc. ) Display SSD, teclados e muito mais.
Você pode aprender programação BASIC no U-BLOX NINA W106 onde quer que esteja. Nenhum hardware é necessário.
UBLOX NINA W106
Wi-Fi 802.11b/g/n
Dual-Mode Bluetooth v4.2
Poderoso suporte de CPU aberta para aplicativos personalizados
Tamanho pequeno e várias opções de antena
Pino compatível com outros módulos NINA
Certificação global
Super Pequena
Módulo baseado no ESP32, com 4MB FLASH
HOMOLOGADO PELA ANATEL
BREAKOUT U-BLOX NINA W106
Algumas características:
-Botão de RESET;
-Pequena;
-Botão de Modo BOOTLOADER (W106);
-Acesso às várias GPIOS.
-Botão de Modo BOOTLOADER (W106);
-Acesso às várias GPIOS.
ROBLOX
Roblox é um MMO (jogo online com vários jogadores) e, principalmente, uma plataforma para criação e desenvolvimento de jogos pelos próprios usuários. Ao contrário do Minecraft, que é um sandbox (um jogo onde o jogador pode fazer e criar o que quiser), o Roblox foi criado como uma ferramenta educacional para ensinar conceitos de física para crianças.
Lançado originalmente em 2006, não demorou muito para que os usuários usassem o Roblox (que no início se chamava DynaBlocks) para criar seus próprios jogos e mundos, com diferenças
Casa da Internet das Coisas
No lado esquerdo, a lâmpada, no lado direito o botão, ambos conectados com ThingSpeak
Quando o botão estiver preto, significa desligado, ao pressioná-lo ele ficará verde e depois de alguns instantes a lâmpada acenderá. Aguarde para você pressioná-lo novamente, depois de alguns instantes a lâmpada se apagará.
Aqui ROBLOX apertou o botão, então o Abajour ligou e o contador de visitas aumentou, tudo via ThingSpeak
CRIANDO CONTA NO THINGSPEAK
Crie uma conta no ThingSpeak
Em Channel Settings crie Field: Field1
Em API keys anote as chaves para escrita e Leitura de dados noThingsSpeak
SIMULANDO ANNEX BASIC no U-BLOX NINA W106 E ACESSANDO LED VIA ROBLOX
- Abra o projeto abaixo
- Baixe o ZIP abaixo
wokwi-boards-master.zip e descompacte
- Click na área do programa em BASIC
- Pressione F1 e escolha Load Custom Board File
- Aponte para caminho da pasta que você descompactou, mais precisamente no Folder
C:\yourfolder\wokwi-boards-master\boards\esp32-nina-w10x
De um Play e ficará assim!
Basicamente o ANNEX BASIC consulta o ThingSpeak para verificar o estado do Field1, que corresponde ao estado que a aplicação Roblox altera quando pressiona o botão.
ANNEX BASIC WOKWI
LUA SCRIPT
--LUA SCRIPT (JSON was not used)In Script there are some tips.local HttpService = game:GetService("HttpService") local Result --Http local URL_ISS --Http request local function printISS() local response local data -- Use pcall in case something goes wrong pcall(function () response = HttpService:GetAsync(URL_ISS) end) if not response then return false end Result=response return true end --Get last ThingSpeak State function Last_State_Counter() wait(5) URL_ISS="https://api.thingspeak.com/channels/1097028/feeds.json?api_key=xxxxxxxxxC&results=1" printISS() --print(Result) --{"channel":{"id":1097028,"name":"ROBLOX","description":"Experimental Test","latitude":"0.0","longitude":"0.0","field1":"Field Label 1","field2":"Field Label 2","created_at":"2020-07-10T18:15:15Z","updated_at":"2020-07-13T00:37:00Z","last_entry_id":179},"feeds":[{"created_at":"2020-07-13T02:17:23Z","entry_id":179,"field1":"1","field2":"7"}]} --Not Using JSON local S_begin, S_end = string.find(Result,"\"field1\":\"",-32) --got 0 or 1 (OFF or ON) local On_Off = string.sub(Result, S_end + 1 , S_end + 1) if On_Off == "0" then workspace.Lamp1.Light.PointLight.Enabled = false State_1=0; workspace.Button1.Button.BrickColor = BrickColor.Black() end if On_Off == "1" then workspace.Lamp1.Light.PointLight.Enabled = true State_1=1; workspace.Button1.Button.BrickColor = BrickColor.Green() end --search at last 32 characters --"field2":"9999"}]} local S_begin, S_end = string.find(Result,"\"field2\":\"",-32) Result = string.sub(Result,S_end+1) --remove "}]} Counter = string.gsub(Result,"\"}]}","") --print(Counter) workspace.Sign.Text.SurfaceGui.TextLabel.Text = "Visits: " .. Counter end --Button Event with Debounce function debounce(func) local isRunning = false -- Create a local debounce variable return function(...) -- Return a new function if not isRunning then isRunning = true func(...) -- Call it with the original arguments isRunning = false end end end workspace.Button1.Button.Touched:Connect(debounce(function(hit) --print("Button 1 pressed, sending IoT info") --Print the message if State_1==0 then --&field = 1 = ON Counter = Counter + 1 URL_ISS = "https://api.thingspeak.com/update?api_key=xxxxxxxxx&field1=1&field2=" .. Counter workspace.Button1.Button.BrickColor = BrickColor.Red() State_1 = 1 else --&field = 0 = OFF URL_ISS = "https://api.thingspeak.com/update?api_key=xxxxxxxxxQ&field1=0&field2=" .. Counter workspace.Button1.Button.BrickColor = BrickColor.Black() State_1 = 0 end printISS() wait(15) --Wait for 15 second to ThingSpeaks accept other command --print(Result) --print("Sent") end)) --Get Last state of ThingSpeak, you can modify direcly on Browser Last_State_Counter() workspace.Sign.Text.SurfaceGui.TextLabel.Text = "Visits: 0000" --Main loop (each 5 seconds, see the State of Key (thingspeak) and Turn On/off a Light! while 1==1 do wait(5) URL_ISS="https://api.thingspeak.com/channels/1097028/feeds.json?api_key=xxxxxxxxx&results=1" printISS() print(Result) --{"channel":{"id":1097028,"name":"ROBLOX","description":"Experimental Test","latitude":"0.0","longitude":"0.0","field1":"Field Label 1","created_at":"2020-07-10T18:15:15Z","updated_at":"2020-07-10T18:15:15Z","last_entry_id":73},"feeds":[{"created_at":"2020-07-10T21:04:30Z","entry_id":72,"field1":"1"},{"created_at":"2020-07-10T23:52:09Z","entry_id":73,"field1":"0"}]} --Not Using JSON :( --search at last 32 characters local S_begin, S_end = string.find(Result,"\"field1\":\"",-32) --got 0 or 1 (OFF or ON) local On_Off = string.sub(Result, S_end + 1 , S_end + 1) --print(On_Off) if On_Off == "0" then workspace.Lamp1.Light.PointLight.Enabled = false workspace.Button1.Button.BrickColor = BrickColor.Black() end if On_Off == "1" then workspace.Lamp1.Light.PointLight.Enabled = true workspace.Button1.Button.BrickColor = BrickColor.Green() end --search at last 32 characters --"field2":"9999"}]} local S_begin, S_end = string.find(Result,"\"field2\":\"",-32) Result = string.sub(Result,S_end+1) --remove "}]} Counter = string.gsub(Result,"\"}]}","") workspace.Sign.Text.SurfaceGui.TextLabel.Text = "Visits: " .. Counter end