import network
import time
from machine import Pin, PWM, SoftI2C
from umqtt.simple import MQTTClient
import mpu6050
# MQTT Server Parameters
MQTT_CLIENT_ID = "vibration-sensor-prototype"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_TOPIC_PUB = "vibration/log"
MQTT_TOPIC_SUB = "vibration/control"
# Setup for I2C and MPU6050
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))
mpu = mpu6050.accel(i2c)
# Buzzer setup
buzzer = PWM(Pin(27))
buzzer.duty(0)
# Connect to WiFi
print("Connecting to WiFi...", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# Connect to MQTT broker
print("Connecting to MQTT broker...", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)
client.connect()
print(" Connected!")
# Function to process vibration data
def measure_vibration():
prev_vibration = 0
while True:
# Read values from MPU6050
accel_data = mpu.get_values()
vibration = abs(round(accel_data["GyX"] / 16384, 2)) + \
abs(round(accel_data["GyY"] / 16384, 2)) + \
abs(round(accel_data["GyZ"] / 16384, 2))
# Publish vibration data if changed
if vibration != prev_vibration:
message = f"Vibration: {vibration}"
client.publish(MQTT_TOPIC_PUB, message)
print(message)
prev_vibration = vibration
# Activate buzzer if vibration exceeds threshold
if vibration > 1.5:
buzzer.duty(512)
buzzer.freq(1000)
else:
buzzer.duty(0)
time.sleep(1)
# MQTT callback to handle incoming commands
def mqtt_callback(topic, msg):
command = msg.decode()
if command == "turn_on_buzzer":
buzzer.duty(512)
buzzer.freq(1000)
client.publish(MQTT_TOPIC_PUB, "Buzzer turned ON manually")
elif command == "turn_off_buzzer":
buzzer.duty(0)
client.publish(MQTT_TOPIC_PUB, "Buzzer turned OFF manually")
else:
client.publish(MQTT_TOPIC_PUB, "Invalid command received")
# Configure MQTT subscription
client.set_callback(mqtt_callback)
client.subscribe(MQTT_TOPIC_SUB)
# Start vibration monitoring in a loop
try:
measure_vibration()
except KeyboardInterrupt:
print("Stopping...")
buzzer.duty(0)
client.disconnect()