GPIO Controller

Controle GPIO via HTTP de forma simples, rápida e direta.

Sobre

GPIO Controller é uma ferramenta leve para controle de dispositivos IoT usando um protocolo HTTP simples. Projetado para desenvolvedores, makers e entusiastas de sistemas embarcados.

Primeiros Passos

Protocolo utilizado (2 comandos)

POST http://${ip-do-esp}/digital-write?pin=23&value=1
GET http://${ip-do-esp}/pin-state?pin=23

Exemplo de implementação

#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();
}
                        

Links

GitHub: https://github.com/gabrielstrini/gpio-http-protocol
Contato: strini.dev@gmail.com
Política de privacidade: https://bytebits.com.br/gpio-controller/support/privacy-policy