from machine import Pin, I2C
import ssd1306
import time
import urequests
import network
import json
# Configuración OLED
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Botón (pull-up interno)
boton = Pin(2, Pin.IN, Pin.PULL_UP)
# Configuración WiFi y API
WIFI_SSID = "tu_SSID"
WIFI_PASSWORD = "tu_PASSWORD"
CHATGPT_API_KEY = "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"
def mostrar_texto(texto, limpiar=True):
"""Muestra texto en la pantalla OLED"""
if limpiar:
oled.fill(0)
# Divide el texto en líneas que caben en la pantalla
lineas = []
while len(texto) > 21: # 21 caracteres por línea
espacio = texto[:21].rfind(' ')
if espacio == -1:
espacio = 21
lineas.append(texto[:espacio])
texto = texto[espacio+1:]
lineas.append(texto)
# Muestra hasta 5 líneas
for i, linea_texto in enumerate(lineas[:5]):
if i < 5: # La pantalla tiene 6 líneas (0-5) de 12px cada una
oled.text(linea_texto, 0, i*12, 1)
oled.show()
def conectar_wifi():
"""Conecta a la red WiFi con manejo de errores mejorado"""
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
mostrar_texto("Conectando WiFi...")
sta_if.active(True)
sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
intentos = 0
while not sta_if.isconnected() and intentos < 15:
mostrar_texto(f"Conectando...\nIntento {intentos+1}/15", False)
time.sleep(1)
intentos += 1
if sta_if.isconnected():
mostrar_texto(f"WiFi conectado!\nIP: {sta_if.ifconfig()[0]}")
time.sleep(2)
return True
else:
mostrar_texto("Error WiFi\nVerifica credenciales")
time.sleep(2)
sta_if.active(False)
return False
def consultar_chatgpt(prompt):
"""Realiza una consulta a la API de ChatGPT con mejor manejo de errores"""
if not network.WLAN(network.STA_IF).isconnected():
if not conectar_wifi():
return "Error: Sin conexión"
try:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {CHATGPT_API_KEY}"
}
payload = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 100 # Respuesta más corta
}
mostrar_texto("Consultando...\nPor favor espera")
# Timeout de 10 segundos para la solicitud
respuesta = urequests.post(
"https://api.openai.com/v1/chat/completions",
headers=headers,
data=json.dumps(payload),
timeout=10
)
# Verificar si la respuesta es válida
if respuesta.status_code == 200:
datos = respuesta.json()
respuesta.close() # Importante: cerrar la conexión
return datos['choices'][0]['message']['content']
else:
respuesta.close()
return f"Error API: {respuesta.status_code}"
except Exception as e:
return f"Error: {str(e)[:50]}" # Limita la longitud del mensaje de error
def main():
"""Funcion principal con mejor manejo de estados"""
mostrar_texto("Sistema ChatGPT\nOLED + Raspberry Pi Pico W")
time.sleep(2)
prompts = [
"Explicame que es AI en 2 lineas",
"Dime un dato curioso corto",
"Resumen de IoT breve",
"Saludo desde mi Pico W"
]
prompt_index = 0
while True:
mostrar_texto(f"Prompt:\n{prompts[prompt_index]}\n\nPresiona para enviar")
# Esperar a que presionen el botón
while boton.value() == 1:
time.sleep(0.1)
# Anti-rebote
time.sleep(0.3)
# Enviar consulta
respuesta = consultar_chatgpt(prompts[prompt_index])
mostrar_texto("Respuesta:\n" + respuesta)
# Esperar a que suelten el botón
while boton.value() == 0:
time.sleep(0.1)
# Cambiar al siguiente prompt
prompt_index = (prompt_index + 1) % len(prompts)
time.sleep(0.5)
# Iniciar el programa
if __name__ == "__main__":
try:
main()
except Exception as e:
mostrar_texto(f"Error fatal:\n{str(e)}")
while True:
pass