from machine import Pin, ADC, I2C
import onewire, ds18x20
import time
import ssd1306 # opcional, si usas OLED
from rotary_irq import RotaryIRQ
import ds1307
import network
import ujson
from umqtt.simple import MQTTClient
# === Pines ===
btn_start = Pin(25, Pin.IN, Pin.PULL_UP)
btn_stop = Pin(26, Pin.IN, Pin.PULL_UP)
pot = ADC(Pin(33))
pot.atten(ADC.ATTN_11DB)
pot.width(ADC.WIDTH_10BIT)
# === Sensor temperatura DS18B20 ===
ds_pin = Pin(4)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
# === Encoder ===
rpm_encoder = RotaryIRQ(pin_num_clk=34, pin_num_dt=35, min_val=0, max_val=100, reverse=False)
rpm_raw=0
rpm = 0
# === Botón del encoder ===
btn_encoder = Pin(32, Pin.IN, Pin.PULL_UP)
# === Motor ===
motor_on = False
step_pins = [Pin(18, Pin.OUT), Pin(19, Pin.OUT), Pin(21, Pin.OUT), Pin(22, Pin.OUT)]
step_seq = [
[1,0,0,1],
[1,0,0,0],
[1,1,0,0],
[0,1,0,0],
[0,1,1,0],
[0,0,1,0],
[0,0,1,1],
[0,0,0,1],
]
step_index = 0
# === RTC ===
i2c = I2C(1, scl=Pin(17), sda=Pin(16))
rtc = ds1307.DS1307(i2c)
rtc.start()
start_time = 0
elapsed_time = 0.0
# === Funciones ===
def read_temp():
ds_sensor.convert_temp()
time.sleep_ms(750)
for rom in roms:
return ds_sensor.read_temp(rom)
return None
def read_vibration():
val = pot.read()
return round(val * 5.0 / 1023, 2) # Rango 0-5 mm/s
def update_rpm():
global rpm
rpm = rpm_encoder.value()
def step_motor():
global step_index
for i in range(4):
step_pins[i].value(step_seq[step_index][i])
step_index = (step_index + 1) % 8
# WiFi para Wokwi
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wokwi-GUEST", "")
while not wlan.isconnected():
print("Conectando a WiFi...")
time.sleep(1)
print("WiFi conectado:", wlan.ifconfig())
# MQTT
mqtt_server = "test.mosquitto.org"
mqtt_port = 1883 # sin SSL
mqtt_topic = "luis/simulacion"
mqtt_client_id = "esp32_luis_001"
def connect_mqtt():
try:
client = MQTTClient(mqtt_client_id, mqtt_server, port=mqtt_port)
client.connect()
print("Conectado al broker MQTT")
return client
except Exception as e:
print("Error al conectar con MQTT:", e)
return None
# Ejecutar conexión
connect_wifi()
time.sleep(2)
mqtt_client = connect_mqtt()
# === Loop ===
print("Iniciando sistema...")
while True:
if not btn_start.value():
if not motor_on:
motor_on = True
start_time = time.time() - elapsed_time # Reanudar desde anterior
# print("\nMotor ENCENDIDO")
elif not btn_stop.value():
if motor_on:
motor_on = False
elapsed_time = time.time() - start_time # guarda el tiempo acumulado
# print("\nMotor APAGADO")
if motor_on:
rpm_raw = rpm_encoder.value()
rpm = 0 + int((rpm_raw / 100) * 1700) # Escala 0–100 → 1200–1700
vibration = read_vibration()
temp = read_temp()
usage_time = (time.time() - start_time) * 1 # en horas
step_motor()
print(f"{temp:.2f},{rpm},{vibration:.2f},{usage_time:.2f}")
# Publicar datos por MQTT solo si hay conexión
if mqtt_client:
payload = ujson.dumps({
"temp": temp,
"rpm": rpm,
"vib": vibration,
"tiempo": usage_time
})
mqtt_client.publish(mqtt_topic, payload)
time.sleep(3)ENCODER RPM
POT VIBRACION
MOTOR
SENSOR TEMP
START
STOP
MODULO RELOJ