ROBLO-IoT e ThingSpeak
O objetivo deste BLOG é apresentar uma ideia geral de como o NINA B302 possa ser comandado pelo jogo ROBLOX e assim acender ou apagar uma lampada quando no mapa do mesmo você acionar ou não um botão, a contagem de pessoas que visitaram o mapa ROBLOX será registrada, foi utilizado como ponte o ThingSpeak.
Uma proposta para se utilizar o ROBLOX para aplicações para Internet Das Coisas junto com ThingSpeak.
Talvez seja a primeira aplicação do ROBLOX para IoT (Internet of Things)
ROBLOX
Roblox é um MMO (jogo online com múltiplos jogadores) e, principalmente, uma plataforma de criação e desenvolvimento de jogos pelos próprios usuários. Diferente de Minecraft, que é um sandbox (um jogo onde o jogador pode fazer e criar o que quiser), Roblox foi criado como uma ferramenta educacional para ensinar conceitos de Física para crianças.
Lançado originalmente em 2006, não levou muito tempo para os usuários usarem Roblox (que no início se chamava DynaBlocks) para criar seus próprios jogos e mundos, de diversas temáticas. A partir daí, a desenvolvedora Roblox Corp. abriu o desenvolvimento e tornou a ferramenta um jogo livre (saindo do foco educacional).
ADAFRUIT WIFININA/ADAFRUIT NRF52 ARDUINO
A Adafruit foi fundada em 2005 pelo engenheiro do MIT, Limor "Ladyada" Fried. Seu objetivo era criar o melhor local on-line para o aprendizado de eletrônicos e para a fabricação dos melhores produtos projetados para fabricantes de todas as idades e níveis de habilidade.
SMARTCORE
A SmartCore fornece módulos para comunição wireless, biometria, conectividade, rastreamento e automação.
Nosso portifólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.
Mais detalhes em www.smartcore.com.br
THINGSPEAK
Thingspeak é uma plataforma de análise IoT (Internet of Things) que permite agregar, visualizar e analisar streams de dados, de uma forma muito simples. Uma das grandes vantagens da plataforma Thingspeak é que nos permite visualizar os dados enviados pelos nossos dispositivos, em tempo real, mas também a possibilidade de analisar os mesmo recorrendo ao poderoso Matlab.
Instalando Arduino Adafruit no NINA B302
Abaixo o roteiro para você seguir:
Baixe e instale o Arduino IDE
Inicie o Arduino IDE, vá em Preferências e adicione
https://www.adafruit.com/package_adafruit_index.json
Baixe e instale o Arduino IDE
Inicie o Arduino IDE, vá em Preferências e adicione
https://www.adafruit.com/package_adafruit_index.json
como "URL adicional do gerenciador de pastas"
Abra o Boards Manager no menu Tools -> Board e instale o "Adafruit nRF52 by Adafruit"
Selecione sua placa nRF5 no menu Ferramentas -> Placa
Adafruit Bluefruit nRF52 Feather
Abra o Boards Manager no menu Tools -> Board e instale o "Adafruit nRF52 by Adafruit"
Selecione sua placa nRF5 no menu Ferramentas -> Placa
Adafruit Bluefruit nRF52 Feather
OBSERVAÇÃO: Durante a instalação, o Arduino IDE leva alguns minutos para extrair as ferramentas após o download, por favor, seja paciente.
Use o gravador SEGGER JLINK para gravar o BREAKOUT com módulo NINA B302, conecte nos pinos do SWCLK (pino 7) e SWDIO (pino 9) do SEGGER JLINK nos pinos SWDCLK e SWDIO do BREAKOUT (pinos nas laterais, próximo à antena). Não esquecer de ligar os GND do BREAKOUT no GND do SEGGER JTAG, bem como alimentar o BREAKOUT com 3.3V.
Ligue os pinos SWD DIO e CLK ...
Abra J-FLASH lite e grave o bootloader da Adafruit
O mesmo se encontra em
....\packages\adafruit\hardware\nrf52\0.19.0\bootloader\feather_nrf52840_express
Compile depois para o NINA B302
Com ele, você poderá transferir programas via DFU USB. Maiores detalhes sobre este bootloader
Segundo a documentação, se você pressionar o reset, o módulo aguardará por um certo tempo se há algo sendo enviado pelo Arduino, ou seja, o programa a ser gravado via DFU.
ATENÇÃO, o bootloader usa USB para gravação do NINA 302, OU SEJA, CRIA UMA COMM VIRTUAL, TAMBÉM PARA SER A SERIAL PADRÃO DO ARDUINO
INSTALE OS DRIVERS
Conecte na USB + e USB - um cabo USB, AGUARDE INSTALAR OS DRIVERS
Futuramente altere arquivo variant.cpp para que as GPIOS sejam os mesmos do NINA B302, atualmente estão para o ADAFRUIT FEATHER EXPRESS.
Copie
Criado pelo Autor
boards.txt
variant.h
viariant.cpp
CONFIGURAÇÃO DO ThingSpeak
1) Crie um conta no ThingSpeack
2) Em Channel Settings crie dois Fields: Field1 e Field2
3) Em API keys anote as chaves para escrita e Leitura de dados noThingsSpeak
4) Teremos então basicamente duas URLS, uma para escrita e outra para leitura dos Fields.
https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXX&field1=X&field2=XXXX
https://api.thingspeak.com/channels/CCCCCCCCC/fields/1.json?api_key=XXXXXXXXXXXXXX
&results=1
Instale o Roblox
Como instalar o Roblox
- Vá ao site da Roblox e faça o login na sua conta.
- Ao entrar no Roblox, visite qualquer jogo e clique no botão verde Jogar.
- Uma janela pop-up aparecerá informando que o Roblox está instalando
- Uma vez instalado, o jogo será aberto automaticamente.
Nota: Uma janela pop-up secundária pode aparecer solicitando que você selecione um programa. Selecione Roblox e confirme. Se você optar por lembrar de sua escolha, não precisará realizar essa ação no futuro.
Uma vez instalado o ROBLOX, seja no PC ou em seu celular, procure por ROBLO-IoT
Conhecendo com ROBLO-IoT, 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 ficará verde e depois de alguns instantes a lâmpada acenderá. Aguarde 15 segundos para novamente você pressionar-lo, depois de alguns instantes a lâmpada apagará.
Aqui ROBLOX apertou o botão, então o Abajour ligou e contador de visitas incrementou, tudo via ThingSpeak
Resumo da Operação
Como funciona:
Toda vez o Roblox toca o Botão, uma mensagem via HTTP é enviada para o ThingSpeak, contendo o estado do Botão.
Toda vez que o Botão é pressionado para Ligar, é enviado enviado para o ThingSpeak uma atualização de vezes/visita que o botão foi pressionado.
A cada cinco segundos, o Roblox faz uma requisição ao ThingSpeak solicitando o estado do botão, então acende ou apaga o Abajour conforme seu valor. Também é atualizado um painel com as visitas realizadas por todo ROBLOX MANIACS do mundo todo!
A placa U-blox a cada cinco segundos fará uma requisição HTTP ao ThingSpeak sobre o estado do Botão e assim acender ou apagar um LED.
LUA SCRIPT (não foi utilizado JSON)
No Script tem algumas dicas.
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
Transferindo Programa para o NINA B302
Compile o programa e pressione o botão para gravar.
Ao aparecer a mensagem "Upgrading target on COM...", pressione imediatamente o botão de reset do módulo NINA B302
Veja o resultado do programa
Veja o resultado do programa
/****************************************************************************************************************************
WiFiWebClientRepeating.ino
This sketch connects to a a web server and makes a request
using a WiFi equipped Arduino board.
created 23 April 2012
modified 31 May 2012
by Tom Igoe
modified 13 Jan 2014
by Federico Vanzati
http://www.arduino.cc/en/Tutorial/WifiWebClientRepeating
This code is in the public domain.
Based on and modified from WiFiNINA libarary https://www.arduino.cc/en/Reference/WiFiNINA
to support other boards besides Nano-33 IoT, MKRWIFI1010, MKRVIDOR4000, etc.
Built by Khoi Hoang https://github.com/khoih-prog/ESP8266_AT_WebServer
Licensed under MIT license
Version: 1.5.2
Copyright (c) 2018 Arduino SA. All rights reserved.
Copyright (c) 2011-2014 Arduino LLC. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Version Modified By Date Comments
------- ----------- ---------- -----------
1.5.0 K Hoang 27/03/2020 Initial coding to support other boards besides Nano-33 IoT, MKRWIFI1010, MKRVIDOR4000, etc.
such as Arduino Mega, Teensy, SAMD21, SAMD51, STM32, etc
1.5.1 K Hoang 22/04/2020 Add support to nRF52 boards, such as AdaFruit Feather nRF52832, nRF52840 Express, BlueFruit Sense,
Itsy-Bitsy nRF52840 Express, Metro nRF52840 Express, etc.
1.5.2 K Hoang 09/05/2020 Port FirmwareUpdater to permit nRF52 boards to update W102 firmware and SSL certs on IDE
Update default pin-outs.
*****************************************************************************************************************************/
#include <SPI.h>
#include <WiFi_Generic.h>
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = "Andreia Oi Miguel 2.4G"; // your network SSID (name)
char pass[] = "xxxxxxxx"; // your network password (use for WPA, or use as key for WEP), length must be 8+
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
// Initialize the Wifi client library
WiFiClient client;
// server address:
char server[] = "api.thingspeak.com";
//IPAddress server(64,131,82,241);
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 5L * 1000L; // delay between updates, in milliseconds
void setup()
{
pinMode(8,OUTPUT);
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial);
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE)
{
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION)
{
Serial.println("Please upgrade the firmware");
}
// attempt to connect to Wifi network:
while (status != WL_CONNECTED)
{
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
//delay(10000);
}
// you're connected now, so print out the status:
printWifiStatus();
}
String Http_Concat = "";
void loop()
{
// if there's incoming data from the net connection.
// send it out the serial port. This is for debugging
// purposes only:
while (client.available())
{
char c = client.read();
Http_Concat.concat(c);
//Serial.write(c);
}
// if ten seconds have passed since your last connection,
// then connect again and send data:
if (millis() - lastConnectionTime > postingInterval)
{
//{"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":195},"feeds":[{"created_at":"2020-07-13T17:16:26Z","entry_id":195,"field1":"1","field2":"14"}]}
// point to the last entry_id, then search to field1 = 0 and field1 = 1
Http_Concat = Http_Concat.substring(Http_Concat.indexOf("entry_id"));
//Find it
Serial.println(Http_Concat);
if(Http_Concat.lastIndexOf("\"field1\":\"1\"") > 0)
{
digitalWrite(8,HIGH);
}
if(Http_Concat.lastIndexOf("\"field1\":\"0\"") > 0)
{
digitalWrite(8,LOW);
}
Http_Concat="";
httpRequest();
}
}
// this method makes a HTTP connection to the server:
void httpRequest()
{
// close any connection before send a new request.
// This will free the socket on the Nina module
client.stop();
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("connecting...");
// send the HTTP PUT request:
client.println("GET /channels/xxxxxxx/feeds.json?api_key=xxxxxxxxxx&results=1 HTTP/1.1");
client.println("Host: api.thingspeak.com");
client.println("User-Agent: ArduinoWiFi/1.1");
client.println("Connection: close");
client.println();
// note the time that the connection was made:
lastConnectionTime = millis();
} else {
// if you couldn't make a connection:
Serial.println("connection failed");
}
}
void printWifiStatus()
{
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
DÚVIDAS
suporte@smartcore.com.br
Referências:
https://en.help.roblox.com/hc/pt-br/articles/204473560-Como-Instalar-e-Jogar-Roblox-Usando-o-Navegador
https://api.thingspeak.com/
https://tecnoblog.net/308663/o-que-e-e-como-jogar-roblox/
Referências:
https://en.help.roblox.com/hc/pt-br/articles/204473560-Como-Instalar-e-Jogar-Roblox-Usando-o-Navegador
https://api.thingspeak.com/
https://tecnoblog.net/308663/o-que-e-e-como-jogar-roblox/
Thanks to my son
José Pietro Ferreira Wisintainer, who presented me ROBLOX
Nenhum comentário:
Postar um comentário