MQTT summeriprojekti
Lähetä MQTT-viestejä painamalla NodeMCU ESP-12E:hen liitettyä nappia. Kun Raspberry Pi 3 vastaanottaa viestin, se soittaa summeria ja merkkivalo palaa.
Napin painaminen ESP-12E:llä julkaisee MQTT-viestin, jonka Raspberryllä pyörivä Mosquitto MQTT-broker vastaanottaa. Samalla Raspberryllä on asennettuna myös Paho-MQTT-client, joka on tilannut kyseisen MQTT-viestin aiheen. Jos viestin sisältö vastaa ennalta määriteltyä merkkijonoa, niin summeri soi ja punainen LED syttyy hetkeksi. Lisäksi Raspberry Pi myös lähettää minulle sähköpostiviestin. Siten tiedän, että nappia on painettu, vaikka en oliskaan summerin luona.
Nappien määrä on hyvin skaalautuva, ja vaatii ainoastaan pieniä lisäyksiä koodiin. NodeMCU ESP-12E:n saa alle 5 eurolla, joten nappeja voi halvalla tehdä useammankin. Summereita taas ei useampaa tarvita. Halutessaan eri nappien painamiset voisi erottaa eri värisillä LED-valoilla, mutta en nähnyt tälle tarvetta, sillä näen kuitenkin Pi:n lähettämästä viestistä, miltä napilta hälytys on lähtenyt.
Kytkentäkaavion selitykset:
- Mustat hyppylangat = digital data
- Siniset hyppylangat = maadoitus
- Punaiset hyppylangat = 3.3V VCC
Osat nappia varten:
Kappalemäärä | Osan nimi |
---|---|
1 | NodeMCU ESP-12E (esp8266) |
1 | Large button |
1 | Red LED |
1 | 10K potentiometer |
1 | 220 ohm resistor |
2 | Small breadboard |
5 | Hyppylanka |
Osat summeria varten:
Kappalemäärä | Osan nimi |
---|---|
1 | Raspberry Pi 3 Model B |
1 | Passive buzzer |
1 | RED LED |
1 | 100 ohm resistor |
1 | 220 ohm resistor |
1 | Small breadboard |
4 | Hyppylanka |
Nappia varten käytetyt kirjastot:
- ESP8266WiFi.h
- PubSubClient.h
Summeria varten käytetyt kirjastot:
- time
- sys
- paho.mqtt.client
- RPi.GPIO
- smtplib
Raspberry Pi 3:n konfigurointi:
MQTT-brokerin ja -clientin asennus
sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients # not required but useful for testing purposes
wget https://files.pythonhosted.org/packages/2a/5f/cf14b8f9f8ed1891cda893a2a7d1d6fa23de2a9fb4832f05cef02b79d01f/paho-mqtt-1.3.1.tar.gz
tar -xzvf paho-mqtt-1.3.1.tar.gz
cd paho-mqtt-1.3.1
sudo python setup.py install
Python-koodin asentaminen GitHubista
sudo apt-get install git
git-clone https://github.com/PyhaMarkus/mqtt-buzzer-project.git
cd mqtt-buzzer-project
nano mqtt_buzzer.py # change the MQTT and email information to match yours
Python koodin ajaminen
cd mqtt-buzzer-project
python mqtt_buzzer.py
Lähdekoodi projektia varten:
Koodi on ladattavissa GitHub-repositoriostani: https://github.com/PyhaMarkus/mqtt-buzzer-project
Arduino-koodi NodeMCU ESP-12E:lle
// Include libraries: #include <ESP8266WiFi.h> #include <PubSubClient.h> // WLAN information: const char* ssid = "your_network_ssid"; const char* password = "your_password"; // MQTT-broker information: const char* mqttServer = "192.168.43.223"; const int mqttPort = 1883; // Change this to whatever port you're using for MQTT. 1883 by default. // Define GPIO pins const int buttonPin = 12; const int ledPin = 4; int buttonState = 0; // default button status // Allows establishing a connection to the MQTT-broker WiFiClient espClient; PubSubClient client(espClient); // Setup starts here: void setup() { // Initialize LED pin as output pinMode(ledPin, OUTPUT); // Initialize button pin as input: pinMode(buttonPin, INPUT); // Initialize a serial connection for outputs Serial.begin(115200); // Connect to the WiFi network WiFi.begin(ssid, password); // While WiFi is not connected, while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } // When WiFi has connected, output IP-address Serial.println(WiFi.localIP()); // Specify the Ip-address and port of the MQTT-broker client.setServer(mqttServer, mqttPort); } // Loop function runs over and over again void loop() { // Read the state of the button: buttonState = digitalRead(buttonPin); // If WiFi has been connected to and the button has been pressed, if (WiFi.status() == WL_CONNECTED && buttonState == HIGH) { Serial.println("We're connected to WiFi/MQTT-broker and the buttonState is HIGH!"); // While MQTT-broker has not been connected to, while (!client.connected()) { Serial.println("Connecting to MQTT-broker..."); // If connection has been successful, if (client.connect("ESP8266Client")) { Serial.println("Connected to MQTT-broker and the button has been pressed!"); // If not, } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } // Publish a message with the topic and contents of: client.publish("support/location1", "buttonState is HIGH - Location1"); // Turn the LED on for 3 seconds. digitalWrite(ledPin, HIGH); delay(3000); digitalWrite(ledPin, LOW); // If the WiFi has been connected to but the button has not been pressed, } else if (WiFi.status() == WL_CONNECTED && buttonState == LOW) { Serial.println("We're connected to WiFi and buttonState is LOW!"); // If neither of the above arguments is True, then... } else { Serial.println("We're NOT connected to WiFi!"); } }
Python koodi Raspberry Pi 3:lle
#!/usr/bin/python #-*- coding: utf-8 -*- # Import libraries import time import sys import paho.mqtt.client as mqtt import RPi.GPIO as GPIO import smtplib # Define GPIO pins for the LED and the buzzer ledPin = 23 buzzerPin = 18 #GPIO18 is PWM capable # Initialize GPIO pins as output GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(ledPin,GPIO.OUT) GPIO.setup(buzzerPin, GPIO.OUT) # When a connection to MQTT-broker is successful def on_connect(client, userdata, flags, rc): print("Connected with result code"+str(rc)) client.subscribe("support/#") # Subscribe to topic # When a message is received def on_message(client, userdata, msg): #global sender_ID if msg.payload == "buttonState is HIGH - Location1": sender_ID = "location1" print("Location1: The button has been pressed!\nSounding the alarm...") GPIO.output(ledPin,GPIO.HIGH) # Turn on the LED buzzer = GPIO.PWM(buzzerPin, 440) # Turn on the buzzer buzzer.start(10) # Buzzer volume 10% time.sleep(1.0) buzzer.stop() # Turn off the buzzer time.sleep(4.0) GPIO.output(ledPin,GPIO.LOW) # Turn off the LED elif msg.payload == "buttonState is HIGH - Location2": sender_ID = "location2" print("Location2: The button has been pressed!\nSounding the alarm...") GPIO.output(ledPin,GPIO.HIGH) # Turn on the LED buzzer = GPIO.PWM(buzzerPin, 440) # Turn on the buzzer buzzer.start(10) # Buzzer volume 10% time.sleep(1.0) buzzer.stop() # Turn off the buzzer time.sleep(4.0) GPIO.output(ledPin,GPIO.LOW) # Turn off the LED # GMAIL message contents TO = 'example.email@gmail.com' SUBJECT = 'Button Alert!' TEXT = "The button has been pressed in: %s!" % sender_ID # GMAIL user setup gmail_sender = 'sender.email@gmail.com' gmail_passwd = 'sender_gmail_password' # GMAIL authentication server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() server.starttls() server.ehlo() server.login(gmail_sender, gmail_passwd) # GMAIL message structure BODY = "\r\n".join([ "TO: %s" % TO, "FROM: %s" % gmail_sender , "Subject: %s" % SUBJECT , "", TEXT ]) # Send the mail server.sendmail(gmail_sender, [TO], BODY) # MQTT information client = mqtt.Client() client.connect("127.0.0.1",1883,60) client.on_connect = on_connect client.on_message = on_message client.loop_forever()
TÄTÄ DOKUMENTTIA SAA KOPIOIDA JA MUOKATA GNU GENERAL PUBLIC LICENSE (VERSIO 3 TAI UUDEMPI) MUKAISESTI: http://www.gnu.org/licenses/gpl.html
MARKUS PYHÄRANTA