Controle GPIO via HTTP de forma simples, rápida e direta.
GPIO Controller é uma ferramenta leve para controle de dispositivos IoT usando um protocolo HTTP simples. Projetado para desenvolvedores, makers e entusiastas de sistemas embarcados.
POST http://${ip-do-esp}/digital-write?pin=23&value=1
GET http://${ip-do-esp}/pin-state?pin=23
#include <WiFi.h>
#include <WebServer.h>
// ======================
// CONFIG WIFI
// ======================
const char* ssid = "SEU_WIFI";
const char* password = "SUA_SENHA";
// ======================
// CONFIG PINOS (TOPO)
// ======================
int controllablePins[] = {2, 23}; // <<< define aqui os pinos válidos
const int controllablePinsCount = sizeof(controllablePins) / sizeof(controllablePins[0]);
int pinStates[40]; // Array para armazenar os estados dos pinos
// ======================
// SERVER
// ======================
WebServer server(80);
// ======================
// VALIDATION
// ======================
bool isValidPin(int pin) {
for (int i = 0; i < controllablePinsCount; i++) {
if (pin == controllablePins[i]) {
return true;
}
}
return false;
}
bool isValidValue(int value) {
return value == 0 || value == 1;
}
// ======================
// HANDLERS
// ======================
void handleDigitalWrite() {
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
server.sendHeader("Access-Control-Allow-Headers", "Content-Type");
if (!server.hasArg("pin") || !server.hasArg("value")) {
server.send(400, "text/plain", "MISSING_PARAMETER");
return;
}
int pin = server.arg("pin").toInt();
int value = server.arg("value").toInt();
if (!isValidPin(pin)) {
server.send(400, "text/plain", "GPIO_NOT_AVAILABLE");
return;
}
if (!isValidValue(value)) {
server.send(400, "text/plain", "INVALID_VALUE");
return;
}
pinMode(pin, OUTPUT);
digitalWrite(pin, value);
pinStates[pin] = value;
Serial.printf("GPIO %d => %d\n", pin, value);
server.send(200, "text/plain", String(value));
}
void handleReadPinState() {
server.sendHeader("Access-Control-Allow-Origin", "*");
server.sendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
server.sendHeader("Access-Control-Allow-Headers", "Content-Type");
if (!server.hasArg("pin")) {
server.send(400, "text/plain", "MISSING_PARAMETER");
return;
}
int pin = server.arg("pin").toInt();
if (!isValidPin(pin)) {
server.send(400, "text/plain", "GPIO_NOT_AVAILABLE");
return;
}
int value = pinStates[pin];
Serial.printf("GET PIN STATE %d => %d\n", pin, value);
server.send(200, "text/plain", String(value));
}
void initializeControllablePin(int pin) {
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
pinStates[pin] = LOW;
}
// ======================
// SETUP
// ======================
void setup() {
Serial.begin(115200);
// Inicializa TODOS os pinos configurados no topo
for (int i = 0; i < controllablePinsCount; i++) {
initializeControllablePin(controllablePins[i]);
}
WiFi.begin(ssid, password);
Serial.print("Connecting WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
// ROUTES
server.on("/digital-write", handleDigitalWrite);
server.on("/pin-state", handleReadPinState);
server.begin();
Serial.println("HTTP server started");
}
// ======================
// LOOP
// ======================
void loop() {
server.handleClient();
}