এমএসপিটিটির মাধ্যমে রাস্পবেরি পাইয়ের মাধ্যমে ESP8266 নিয়ন্ত্রণ করা হচ্ছে


9

আমি একটি হোম অটোমেশন প্রকল্পে কাজ করছি। আমার প্রকল্পের মূল লক্ষ্য হ'ল বিভিন্ন স্থানে অবস্থিত রিলে এবং অন্যান্য সেন্সরগুলি নিয়ন্ত্রণ করা। আমি আমার রাস্পবেরি পাই একটি এমকিউটিটি ব্রোকার হিসাবে সেট আপ করেছি। মশকিটো ঠিকঠাক চলছে। আপাতত, আমি যা করার চেষ্টা করছি তা হল এসপি 8266 (জিপিআইও 2) দিয়ে ওয়্যারযুক্ত রিলে ট্রিগার করা। এটি আমার পাইথন ওয়েব সার্ভার কোড:

import paho.mqtt.client as mqtt
from flask import Flask, render_template, request
app = Flask(__name__)

mqttc=mqtt.Client()
mqttc.connect("localhost",1883,60)
mqttc.loop_start()

# Create a dictionary called pins to store the pin number, name, and pin state:
pins = {
   2 : {'name' : 'GPIO 2', 'board' : 'esp8266', 'topic' : 'esp8266/2', 'state' : 'False'}
}

# Put the pin dictionary into the template data dictionary:
templateData = {
'pins' : pins
}

@app.route("/")
def main():
# Pass the template data into the template main.html and return it to the user
return render_template('main.html', **templateData)

# The function below is executed when someone requests a URL with the pin number and action in it:
@app.route("/<board>/<changePin>/<action>")

def action(board, changePin, action):
# Convert the pin from the URL into an integer:
changePin = int(changePin)
# Get the device name for the pin being changed:
devicePin = pins[changePin]['name']
# If the action part of the URL is "on," execute the code indented below:
  if action == "1" and board == 'esp8266':
  mqttc.publish(pins[changePin]['topic'],"1")
  pins[changePin]['state'] = 'True'

if action == "0" and board == 'esp8266':
  mqttc.publish(pins[changePin]['topic'],"0")
  pins[changePin]['state'] = 'False'

# Along with the pin dictionary, put the message into the template data dictionary:
templateData = {
  'pins' : pins
}

return render_template('main.html', **templateData)

if __name__ == "__main__":
app.run(host='0.0.0.0', port=8181, debug=True)

এখানে আমার এইচটিএমএল কোডটি রয়েছে:

<!DOCTYPE html>
<head>
   <title>RPi Web Server</title>
   <!-- Latest compiled and minified CSS -->
   <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
   <!-- Optional theme -->
   <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
   <!-- Latest compiled and minified JavaScript -->
   <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
   <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
   <h1>RPi Web Server - ESP8266 MQTT</h1>
   {% for pin in pins %}
   <h2>{{ pins[pin].name }}
   {% if pins[pin].state == 'True' %}
  is currently <strong>on</strong></h2><div class="row"><div class="col-md-2">
  <a href="/esp8266/{{pin}}/0" class="btn btn-block btn-lg btn-default" role="button">Turn off</a></div></div>
   {% else %}
  is currently <strong>off</strong></h2><div class="row"><div class="col-md-2">
  <a href="/esp8266/{{pin}}/1" class="btn btn-block btn-lg btn-primary" role="button">Turn on</a></div></div>
   {% endif %}
   {% endfor %}
</body>
</html>

এখানে আমার ESP8266 কোডটি রয়েছে:

#include <ESP8266WiFi.h>
#include <PubSubClient.h

const char* ssid = "Godfather";
const char* password = "idontknow";

const char* mqtt_server = "192.168.137.100";

WiFiClient espClient;
PubSubClient client(espClient);

const int ledGPIO2 = 2;

void setup_wifi() {
  delay(10);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected - ESP IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(String topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  if(topic=="esp8266/2"){
      Serial.print("Changing GPIO 2 to ");
      if(messageTemp == "1"){
        digitalWrite(ledGPIO2, HIGH);
        Serial.print("On");
      }
      else if(messageTemp == "0"){
        digitalWrite(ledGPIO4, LOW);
        Serial.print("Off");
      }
  }
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");  

      client.subscribe("esp8266/2");

    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
  // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(ledGPIO2, OUTPUT);

  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);    
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  if(!client.loop())
    client.connect("ESP8266Client");
}

ফলাফল: সবকিছু ঠিকঠাক কাজ করছে বলে মনে হচ্ছে তবে ওয়েব সার্ভারে বোতামটি চাপলে রিলে ট্রিগার করা হয় না। আমি বিশ্বাস করি ইএসপি সঠিকভাবে সাবস্ক্রাইব হয়নি। আমি যখন টার্মিনালে পাইথন স্ক্রিপ্টটি চালিত করি, প্রথম ক্লিকের জন্য আমি টার্মিনালে HTTP / 1.1 "404 পেয়েছি এবং অন্য প্রতিটি ক্লিকে আমি HTTP / 1.1" 200 পেয়েছি

আমার পাই এখনই ডায়নামিক আইপিতে কাজ করছে। তবে আমি নিশ্চিত করেছি যে ESP8266 বর্তমান পাই আইপি ঠিকানার সাথে কনফিগার করা আছে।


1
এই মন্তব্য চেইন এখন বেশ দীর্ঘ হয়; এই কথোপকথন চ্যাটে সরানো হয়েছে । বর্ধিত কথোপকথনের জন্য আরও বন্ধুত্বপূর্ণ পরিবেশে আপনি সেখানে নিজের আলোচনা চালিয়ে যেতে পারেন। আপনি যদি সমাধান করতে সক্ষম না হন এমন সমস্যাগুলির মুখোমুখি হন তবে আপডেটগুলি দিয়ে আপনার প্রশ্ন সম্পাদনা বা নতুন প্রশ্ন জিজ্ঞাসা করুন consider
Aurora0001

1
আমার একাধিক ক্লায়েন্ট থাকলে আমার কোডে কী যুক্ত করা উচিত?
রোহিত মাথুর

উত্তর:


3

আমি আপনাকে সমস্যাটি পচন করার পরামর্শ দিচ্ছি।

সরাসরি এমকিউটিটি ব্রোকারের কাছে বার্তা প্রেরণ করে রিলে পরীক্ষা করার চেষ্টা করুন (অর্থাত্ মশা_পব ক্লায়েন্ট ব্যবহার করে)।

ওয়েব অ্যাপ ব্রোকারের কাছে সঠিক বিষয় এবং বার্তা প্রকাশ করছে কিনা তা পরীক্ষা করার চেষ্টা করুন (অর্থাত্ মশা_সুব ক্লায়েন্ট ব্যবহার করছেন)।

আপনি এসওয়াইএস বিষয় সাবস্ক্রাইব করে (যেমন সংযুক্ত ক্লায়েন্ট বা সাবস্ক্রিপশনের মোট সংখ্যা) দ্বারা আপনার ডিভাইসগুলির আচরণ পর্যবেক্ষণ করতে পারেন ।


1
এবং ESP8266 থেকে একটি পিং (প্রকাশ করুন) যুক্ত করুন যাতে আপনি এটি নিশ্চিত হয়ে যায় যে এটি কাজ করছে এবং এমকিউটিটি সার্ভারে পৌঁছাতে পারে।
ম্যাটসকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.