Alguma vez você já quis simular um ESP32, Arduino ou, até mesmo, um Raspberry Pi Pico – Com Pinos Soldados? Seja por conveniência, para garantir que o projeto funcione antes de implementá-lo ou até mesmo comprar os componentes, provavelmente, já. Se sim, vou lhe apresentar o Wokwi, um simulador excelente para seu projetos. Um simulador é uma ferramenta extremamente bem-vinda (e útil), principalmente se estiver ali, mesmo, em seu navegador. Dito isso, o Wokwi.com está aqui para ajudá-lo! Ele é uma ferramenta gratuita de simulação direto no navegador, em que você pode escrever seus próprios códigos e usar os microcontroladores com outros componentes, como LEDs, Chave Botão R13-507, displays (de 7 segmentos a Display OLED 128×64 0.96″ I2C – Azul/Amarelo), potenciômetros e muitos outros. Também permite monitorar periféricos I2C e seriais. Além de tudo isso, continuamente são adicionados novos componentes.
Primeiro, acesse o site do simulador e, na tela inicial, escolha a placa que deseja utilizar.
Estrutura do Wokwi
Quando se usa algum sensor que pode ter os valores editados, ao clicar no sensor, aparece uma janela para mudar os valores. Veja o exemplo, abaixo, do Módulo Sensor Temperatura e Umidade DHT22:
Mais detalhes na documentação do site: Documentação
Nesse projeto, vamos simular um Uno R3 + Cabo Usb para Arduino, botões e um Buzzer Ativo 9V, o resultado final é um mini piano com Arduino.
Código:
#include "pitches.h" #define BUZZER_PIN 8 const uint8_t buttonPins[] = { 12, 11, 10, 9, 7, 6, 5, 4 }; const int buttonTones[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5}; const int numTones = sizeof(buttonPins) / sizeof(buttonPins[0]); void setup() { for (uint8_t i = 0; i < numTones; i++) { pinMode(buttonPins[i], INPUT_PULLUP); } pinMode(BUZZER_PIN, OUTPUT); } void loop() { int pitch = 0; for (uint8_t i = 0; i < numTones; i++) { if (digitalRead(buttonPins[i]) == LOW) { pitch = buttonTones[i]; } } if (pitch) { tone(BUZZER_PIN, pitch); } else { noTone(BUZZER_PIN); } }
Link para o projeto: Mini Piano
Nesse projeto, vamos simular a mais nova placa da família Raspberry, a Raspberry Pi Pico, com um display de 7 segmentos e uma Chave SS12F46 – 3 terminais. O resultado final é um contador crescente ou decrescente, dependendo da posição da chave.
Outra novidade é que, nesse exemplo, usamos MicroPython para programar o Raspberry. Para usa-la, basta criar um novo arquivo com a extensão .py. Se preferir usar C/C++, crie uma arquivo com a extensão .ino.
Código:
from machine import Pin from utime import sleep # A # --- # F | G | B # --- # E | | C # --- # D pins = [ Pin(2, Pin.OUT), # A Pin(3, Pin.OUT), # B Pin(4, Pin.OUT), # C Pin(5, Pin.OUT), # D Pin(6, Pin.OUT), # E Pin(8, Pin.OUT), # F Pin(7, Pin.OUT), # G Pin(0, Pin.OUT) # DP (not connected) ] # Common anode 7 segment digits = [ [0, 0, 0, 0, 0, 0, 1, 1], # 0 [1, 0, 0, 1, 1, 1, 1, 1], # 1 [0, 0, 1, 0, 0, 1, 0, 1], # 2 [0, 0, 0, 0, 1, 1, 0, 1], # 3 [1, 0, 0, 1, 1, 0, 0, 1], # 4 [0, 1, 0, 0, 1, 0, 0, 1], # 5 [0, 1, 0, 0, 0, 0, 0, 1], # 6 [0, 0, 0, 1, 1, 1, 1, 1], # 7 [0, 0, 0, 0, 0, 0, 0, 1], # 8 [0, 0, 0, 1, 1, 0, 0, 1], # 9 [0, 0, 0, 1, 0, 0, 0, 1], # a [1, 1, 0, 0, 0, 0, 0, 1], # b [0, 1, 1, 0, 0, 0, 1, 1], # C [1, 0, 0, 0, 0, 1, 0, 1], # d [0, 1, 1, 0, 0, 0, 0, 1], # E [0, 1, 1, 1, 0, 0, 0, 1], # F ] def reset(): for pin in pins: pin.value(1) reset() switch = Pin(11, Pin.IN) while True: if switch.value() == 1: for i in range(len(digits)): if switch.value() == 0: break; for j in range(len(pins) - 1): pins[j].value(digits[i][j]) sleep(0.5) else: for i in range(len(digits) - 1, -1, -1): if switch.value() == 1: break; for j in range(len(pins)): pins[j].value(digits[i][j]) sleep(0.5)
Link para o projeto: Contador
Nesse projeto, vamos simular um Módulo WiFi ESP32 DevKitC S1, um módulo DHT22 e o monitor serial. O resultado final é o ESP32 lendo os dados do módulo DHT22 (temperatura e humidade) e enviando via MQTT para um broker, similar a um outro projeto do blog: Sleep Modes no esp8266.
Para rodar esse simulação, é necessário instalar duas bibliotecas:
Para adicionar bibliotecas, basta clicar na aba Library Manager > Botão Mais Roxo > digitar a biblioteca que deseja e clicar nela ou fazer o upload. Em seguida, é só incluir no código.
Código:
/** * @file ESP32_DHT22_Send_MQTT.ino * @author Saulo Aislan * @brief Firmware que ler o sensor de temperatura, envia os dados via MQTT. * @version 0.1 * * @copyright Copyright (c) 2022 * */ #include "EspMQTTClient.h" #include "DHTesp.h" EspMQTTClient client( "Wokwi-GUEST", // SSID WiFi "", // Password WiFi "test.mosquitto.org", // MQTT Broker "mqtt-wokwi", // Client 1883 // MQTT port ); const int DHT_PIN = 15; DHTesp dhtSensor; void setup() { Serial.begin(115200); dhtSensor.setup(DHT_PIN, DHTesp::DHT22); client.enableDebuggingMessages(); // Enable debugging messages sent to serial output client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overridded with enableHTTPWebUpdater("user", "password"). client.enableOTA(); // Enable OTA (Over The Air) updates. Password defaults to MQTTPassword. Port is the default OTA port. Can be overridden with enableOTA("password", port). client.enableLastWillMessage("TestClient/lastwill", "Vou ficar offline"); } /** * @brief Ler os dados do Sensor imprime e envia via MQTT */ void lerEnviarDados() { TempAndHumidity data = dhtSensor.getTempAndHumidity(); Serial.println("Temp: " + String(data.temperature, 2) + "°C"); Serial.println("Humidade: " + String(data.humidity, 1) + "%"); Serial.println("---"); client.publish("topicowokwi/Temp", String(data.temperature, 2) + "°C"); client.publish("topicowokwi/Humidade", String(data.humidity, 1) + "%"); } /** * @brief Esta função é chamada quando tudo estiver conectado (Wifi e MQTT), * para utilizá-la deve-se implemtentar o struct EspMQTTClient */ void onConnectionEstablished() { // Subscribe no "topicowokwi/msgRecebida/#" e mostra a mensagem recebida na Serial client.subscribe("topicowokwi/msgRecebida/#", [](const String & topic, const String & payload) { Serial.println("Mensagem recebida no topic: " + topic + ", payload: " + payload); }); lerEnviarDados(); } void loop() { client.loop(); // Executa em loop }
Link para o projeto: Exemplo ESP32 wokwi
Observação: Para utilizar qualquer função que precisa se conectar com um WiFi, o Wokwi disponibiliza uma rede virtual, Wokwi-GUEST, que não precisar de senha. Para mais informações sobre WiFi, acesse o Guia WiFi ESP32. Para enviar e receber os dados via MQTT, você deve preencher a struct com os dados do WiFi do Wokwi e com os dados do servidor MQTT de sua preferência. No exemplo, utilizei o “test.mosquitto.org” na porta 1883:
EspMQTTClient client( "Wokwi-GUEST", // SSID WiFi "", // Password WiFi "test.mosquitto.org", // MQTT Broker "mqtt-wokwi", // Client 1883 // MQTT port );
Para visualizar os dados do broker MQTT, estou usando o MQTT Explorer, disponível nesse link. Mas, você pode usar o software de sua preferência. As configurações da conexão para esse exemplo são as seguintes:
No exemplo, são utilizados os tópicos de subscribe “topicowokwi/msgRecebida/”, de publish “topicowokwi/Temp” para a temperatura e “topicowokwi/Humidade” para a humidade. Você pode editar como que preferir, mas fique atento que é necessário mudar, também, no servidor MQTT. No caso, configurei o broker para ler nos tópicos “topicowokwi/Temp” e “topicowokwi/Humidade”. Para configurar os tópicos, basta clicar no botão ADVANCED, na tela de configuração, digitar o tópico e clicar em ADD:
Se tudo for configurado corretamente, os dados aparecerão da seguinte forma:
Além de simular diversos componentes, o Wokwi tem um detector de erros de sintaxe na IDE e um monitor serial no simulador.
Exemplo de Erro:
Exemplo do Monitor Serial:
Um simulador é muito bom para agilizar o trabalho de criação de projetos, evitando ter que montar um circuito toda vez que precisar mudar algo. Quando, junto ao simulador de hardware, temos uma IDE para o firmware, o trabalho fica muito mais rápido e fácil. O Wokwi é um excelente simulador. Contudo, nada substitui o circuito real. Então, o Wokwi pode até nós ajudar, mas implementar o circuito físico é essencial para o aprendizado. Para mais materiais como esse, continue acompanhando as postagens semanais do blog e não deixe de visitar nossa loja. Lá, você encontra todos os componentes necessários para desenvolver estes e muitos outros projetos!
Que a força esteja com vocês e até mais!
Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!