#include "pico/cyw43_arch.h"
#include "pico/stdlib.h"
#include "lwip/tcp.h"
#include <string.h>
#include <stdio.h>
#define LED_PIN 12
#define WIFI_SSID "NomeDaRedeWiFi" // Substitua pelo nome da sua rede Wi-Fi
#define WIFI_PASS "SenhaDaRedeWiFi" // Substitua pela senha da sua rede Wi-Fi
#define THINGSPEAK_API_KEY "SUA_CHAVE_API" // Substitua pela sua chave API do ThingSpeak
#define THINGSPEAK_URL "http://api.thingspeak.com/update"
// Buffer para respostas HTTP
#define HTTP_RESPONSE "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n" \
"<!DOCTYPE html><html><body>" \
"<h1>Controle do LED</h1>" \
"<p><a href=\"/led/on\">Ligar LED</a></p>" \
"<p><a href=\"/led/off\">Desligar LED</a></p>" \
"</body></html>\r\n"
// Função para enviar o estado do LED para o ThingSpeak
void send_to_thingspeak(int led_state) {
char request[256];
sprintf(request, "GET " THINGSPEAK_URL "?api_key=%s&field1=%d\r\n", THINGSPEAK_API_KEY, led_state);
struct tcp_pcb *pcb = tcp_new();
if (!pcb) {
printf("Erro ao criar PCB para ThingSpeak\n");
return;
}
// Conecta ao ThingSpeak
ip_addr_t thingSpeak_ip;
if (ipaddr_aton("184.106.153.149", &thingSpeak_ip) == 0) {
printf("Erro ao converter endereço IP do ThingSpeak\n");
return;
}
if (tcp_connect(pcb, &thingSpeak_ip, 80, NULL) != ERR_OK) {
printf("Erro ao conectar ao ThingSpeak\n");
return;
}
// Envia a requisição
tcp_write(pcb, request, strlen(request), TCP_WRITE_FLAG_COPY);
tcp_output(pcb);
tcp_close(pcb);
}
// Função de callback para processar requisições HTTP
static err_t http_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) {
if (p == NULL) {
tcp_close(tpcb);
return ERR_OK;
}
char *request = (char *)p->payload;
if (strstr(request, "GET /led/on")) {
gpio_put(LED_PIN, 1); // Liga o LED
send_to_thingspeak(1); // Envia estado do LED para ThingSpeak
} else if (strstr(request, "GET /led/off")) {
gpio_put(LED_PIN, 0); // Desliga o LED
send_to_thingspeak(0); // Envia estado do LED para ThingSpeak
}
tcp_write(tpcb, HTTP_RESPONSE, strlen(HTTP_RESPONSE), TCP_WRITE_FLAG_COPY);
pbuf_free(p);
return ERR_OK;
}
// Callback de conexão
static err_t connection_callback(void *arg, struct tcp_pcb *newpcb, err_t err) {
tcp_recv(newpcb, http_callback);
return ERR_OK;
}
// Função de setup do servidor TCP
static void start_http_server(void) {
struct tcp_pcb *pcb = tcp_new();
if (!pcb) {
printf("Erro ao criar PCB\n");
return;
}
if (tcp_bind(pcb, IP_ADDR_ANY, 80) != ERR_OK) {
printf("Erro ao ligar o servidor na porta 80\n");
return;
}
pcb = tcp_listen(pcb);
tcp_accept(pcb, connection_callback);
printf("Servidor HTTP rodando na porta 80...\n");
}
int main() {
stdio_init_all();
sleep_ms(10000);
printf("Iniciando servidor HTTP\n");
if (cyw43_arch_init()) {
printf("Erro ao inicializar o Wi-Fi\n");
return 1;
}
cyw43_arch_enable_sta_mode();
printf("Conectando ao Wi-Fi...\n");
if (cyw43_arch_wifi_connect_timeout_ms(WIFI_SSID, WIFI_PASS, CYW43_AUTH_WPA2_AES_PSK, 10000)) {
printf("Falha ao conectar ao Wi-Fi\n");
return 1;
} else {
printf("Conectado ao Wi-Fi.\n");
uint8_t *ip_address = (uint8_t*)&(cyw43_state.netif[0].ip_addr.addr);
printf("Endereço IP %d.%d.%d.%d\n", ip_address[0], ip_address[1], ip_address[2], ip_address[3]);
}
printf("Wi-Fi conectado!\n");
printf("Para ligar ou desligar o LED acesse o Endereço IP seguido de /led/on ou /led/off\n");
}