1

由于 OpenHAB 遇到的这个特殊问题,我刚刚注册了一个帐户。我正在关注此https://openhardwarecoza.wordpress.com/2015/03/29/openhab-mqtt-arduino-and-esp8266-part-3-hardware-arduino-with-ethernet-shield/网站的教程,但因为那里的答复对我没有帮助。我决定去这个网站。

我已经成功安装并使用了 OpenHAB。当我从 HTTP 页面和 android 设备关闭和打开开关时,它工作得很好。但是当我尝试使用 Arduino 上的按钮手动覆盖时。它没有更新它们两个中的开关状态。我正在使用带有 OpenHAB 1.71 版的 Windows

Openhab 服务器注意到按钮的状态有更新,但 HTTP 页面和 android 设备中的按钮根本没有改变。我已经使用 MQTTlens 测试了连接,它工作得很好。

下面是我的代码
项配置

Group All
Switch mqttsw1 "Switch 1" (all) {mqtt=">[mymosquitto:/arduino/l1/com:command:off:0],>[mymosquitto:/arduino/l1/com:command:on:1],<[mymosquitto:/arduino/l1/state:state:default]"}
Switch mqttsw2 "Switch 2" (all) {mqtt=">[mymosquitto:/arduino/l2/com:command:off:0],>[mymosquitto:/arduino/l2/com:command:on:1],<[mymosquitto:/arduino/l2/state:state:default]"}
Number temp "Temperature [%.1f &deg;C]" <temperature> {mqtt="<[mymosquitto:/arduino/temp/state:state:default]"}
Number hum "Humidity [%.1f &#37]" <temperature> {mqtt="<[mymosquitto:/arduino/hum/state:state:default]"}
站点地图配置

sitemap dolphin label="Main Menu"
{
   Frame label="Switch" {
   Switch item=mqttsw1 label="Switch 1"
   Switch item=mqttsw2 label="Switch 2"
}
   Frame label="Weather" {
   Text item=temp
   Text item=hum
} 

Arduino代码

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <DHT.h>
const int butt1 = 3;// the pin that the pushbutton is attached to
const int butt2 = 2;
const int ledPin1 = 5;       
const int ledPin2 = 4;
int ledState1 = HIGH;         
int buttonState1;             
int lastButtonState1 = LOW;   
int ledState2 = HIGH;         
int buttonState2;             
int lastButtonState2 = LOW; 
long previousMillis = 0;
unsigned long currentMillis = 0;
long interval = 60000; // READING INTERVAL
int t = 0;  // TEMPERATURE VAR
int h = 0;  // HUMIDITY VAR
#define DHTPIN 24 // SENSOR PIN
#define DHTTYPE DHT11 // SENSOR TYPE - THE ADAFRUIT LIBRARY OFFERS SUPPORT FOR MORE MODELS
DHT dht(DHTPIN, DHTTYPE);
// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xEF };
IPAddress ip(192, 168, 1, 103);
IPAddress server(192, 168, 1, 100);

void callback(char* topic, byte* payload, unsigned int length);

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void callback(char* topic, byte* payload, unsigned int length) {
Serial.println();
Serial.println("Callback");
Serial.print("Topic = ");
Serial.println(topic);
Serial.print("Payload = ");
for (int i=0;i<length;i++){
Serial.print((char)payload[i]);
}
Serial.println();
 if (strcmp(topic,"/esp1/l1/com")==0) { 
   if (payload[0] == '0') 
    {
     digitalWrite(ledPin1, LOW);
     delay(100);
    client.publish("/esp1/l1/state","0");
    } 
    else if (payload[0] == '1') 
    {
    digitalWrite(ledPin1, HIGH);
        delay(100);
    client.publish("/esp1/l1/state","1");
    }
   } 

  if (strcmp(topic,"/esp1/l2/com")==0) { 
   if (payload[0] == '0') 
    {
    digitalWrite(ledPin2, LOW);
        delay(100);
    client.publish("/esp1/l2/state","0");
    } 
    else if (payload[0] == '1') 
    {
    digitalWrite(ledPin2, HIGH);
     delay(100);
    client.publish("/esp1/l2/state","1");
    }
   }                
} 

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("arduinoClient")) {
      Serial.println("connected");
      client.subscribe("/esp1/#");
      client.publish("conn","Connected");
     } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void push1() {
int reading1 = digitalRead(butt1);
buttonState1 = reading1;
 if (buttonState1 == HIGH) {
   ledState1 = !ledState1;
          if (ledState1 < 1)
          {
            digitalWrite(ledPin1, LOW);
            delay(100);
            client.publish("/esp1/l1/com","0");
            client.publish("/esp1/l1/state","0");
          }
          else
          {
            digitalWrite(ledPin1, HIGH);
            delay(100);
            client.publish("/esp1/l1/com","1");
            client.publish("/esp1/l1/state","1");
          }
        }
      }
void push2() {
int reading2 = digitalRead(butt2);
buttonState2 = reading2;
 if (buttonState2 == HIGH) {
   ledState2 = !ledState2;
          if (ledState2 < 1)
          {
            digitalWrite(ledPin2, LOW);
            delay(100);
            client.publish("/esp1/l2/com","0");
            client.publish("/esp1/l2/state","0");
          }
          else
          {
            digitalWrite(ledPin2, HIGH);
            delay(100);
            client.publish("/esp1/l2/com","1");
            client.publish("/esp1/l2/state","1");
          }
        }
    }
    void temp() {
  h = (int)dht.readHumidity();
  t = (int)dht.readTemperature();
  char temp[2];
  char hum[3];
  sprintf(hum, "%d", h);
  sprintf(temp, "%d", t);
  client.publish("/esp1/temp/state", temp);
  client.publish("/esp1/hum/state", hum);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(butt1, INPUT);
  pinMode(butt2, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  pinMode(26, OUTPUT);      // sets the digital pin as output
  pinMode(22, OUTPUT);      // sets the digital pin as output
  digitalWrite(26, HIGH);   // sets +5v for the sensor
  digitalWrite(22, LOW);    // sets gnd for the sensor
  h = (int)dht.readHumidity();
  t = (int) dht.readTemperature();
    if (client.connect("arduinoClient")) {
  client.publish("conn","Connected");
  client.subscribe("/esp1/#");
   }
}

void loop() {
  // put your main code here, to run repeatedly:
 if (!client.connected()) {
    reconnect();
 }
  currentMillis = millis();
  if (currentMillis - previousMillis > interval) { // READ ONLY ONCE PER INTERVAL
    previousMillis = currentMillis;
    temp();
  }
 int reading1 = digitalRead(butt1);
 int reading2 = digitalRead(butt2);
 if (reading1 != buttonState1) {
  push1();
 }
 if (reading2 != buttonState2){
  push2();
 }
 client.loop();
}

如果有人可以帮助我,我将不胜感激。感谢您的关注 !

此致,

阿尔迪

4

1 回答 1

0

如果我没记错的话,你应该发回 ON 或 OFF 的状态,而不是 1 或 0。

您能否更改您的 arduino 代码以重新打开和关闭并进行测试?例如

client.publish("/esp1/l1/state","ON");
于 2016-01-28T06:44:00.077 回答