esp8266 + dht11 + 两路继电器 实现pc远程控制开关机温度监控.并配置zabbix监控
阅读原文时间:2022年05月30日阅读:3

事因:翻了翻自己之前的硬件小箱子,几年前买的一些小东西,想用用起来.

正好我有些数据放在机器上,有时候需要机器启动,我使用完成后在断开. 其实网络唤醒也能做到,但是机器一直给电也不好,在说家里有小孩AQA

设计思路.

使用双路继电器的一路控制主机AC220V电源的通断.ps[可以用一个GPIO读取pc电源的12v/5v供电来判断pc电源是否被断开.]

使用双路继电器的另一路模拟主机开机按钮. 用来开机和关机

esp8266 1个

dht11 1个

双路继电器 1个

杜邦线若干

改造电源线1个

git仓库地址:[之后有空重新写下代码]

https://github.com/lvusyy/esp8266RemoteControlPC

https://www.processon.com/view/link/5d1ed046e4b0fdb331d3b98b

其它在之后有空在补充吧.

mqtt 安装请参考:

在阿里云上安装Mosquitto zhuanlan.zhihu.com/p/38040998

代码 [有若干逻辑bug,临时写的.]

//#define _TASK_SLEEP_ON_IDLE_RUN // Enable 1 ms SLEEP_IDLE powerdowns between tasks if no callback methods were invoked during the pass
//#define _TASK_TIMEOUT
#include <SimpleDHT.h>
#include <ESP8266WiFi.h>
#include <TaskScheduler.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

//**** dht init
const int pinDHT11 = 2;
SimpleDHT11 dht11(pinDHT11);
const int POWERPIN = 4;
const int OPENBTPIN = 5;
uint8_t poweroffTimeout=0;
/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "HOME"
#define WLAN_PASS       "HOME++++"

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "ip"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME    "user"
#define AIO_KEY         "pass"

/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
// or... use WiFiFlientSecure for SSL
//WiFiClientSecure client;

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

/****************************** Feeds ***************************************/

// Setup a feed called 'photocell' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Publish temperaturePS = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

// Setup a feed called 'onoff' for subscribing to changes.
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/poweronoff");

Adafruit_MQTT_Subscribe openbt = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/btonoff");

int get_temperature();
void pushTemperature();
void clickBtStop();
void set_powerOff();
//void t2disable();
// Task init
Scheduler runner;
Task t1(1000,TASK_FOREVER,&pushTemperature);
//Task t2(100,1,&clickBtStop,&runner,false,NULL,&set_powerOff);

/*************************** Sketch Code ************************************/
void clickBtStart(){
    set_powerOn();
    digitalWrite(OPENBTPIN,HIGH);
    delay(1300);
    digitalWrite(OPENBTPIN,LOW);
}

void clickBtStop(){
    digitalWrite(OPENBTPIN,HIGH);
//    delay(8000);
    delay(1000);
    digitalWrite(OPENBTPIN,LOW);
    poweroffTimeout=90;
//    delay(120000L);
//    set_powerOff();
//    delay(200);
//    digitalWrite(OPENBTPIN,HIGH);
//    delay(8000);
//    digitalWrite(OPENBTPIN,LOW);
}

void set_powerOn(){
    digitalWrite(POWERPIN,LOW);
    Serial.println("called set_powerOn ");
    poweroffTimeout=0;
}

void set_powerOff(){
    digitalWrite(POWERPIN,HIGH);
    Serial.println("called set_poweroff ");
    poweroffTimeout=0;
}

int get_temperature() {

  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return 0;
  }

  Serial.print("Sample OK: ");
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" H");
  return (int)temperature;
}
void pushTemperature()
{
  uint8_t t=0;
  for (int i=0;i<10;i++){
    t=get_temperature();
    if(t<=0){
      t=0;
      }else {
        break;
        }
  }
  if (! temperaturePS.publish(t)) {
    Serial.println(F("Temperature publish Failed"));
  } else {
    Serial.println(F("Temperature publish OK!"));
  }
  if (poweroffTimeout>1){
    poweroffTimeout--;
    Serial.println((int)poweroffTimeout);
    }else if (poweroffTimeout==1){
      poweroffTimeout=0;
      set_powerOff();
    }

}

// Bug workaround for Arduino 1.6.6, it seems to need a function declaration
// for some reason (only affects ESP8266, likely an arduino-builder bug).
void MQTT_connect();

void setup() {
  pinMode(POWERPIN,OUTPUT);
  pinMode(OPENBTPIN,OUTPUT);
  Serial.begin(115200);
  delay(10);
  //digitalWrite(OPENBTPIN,HIGH);//init state
  Serial.println(F("Adafruit MQTT demo"));

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());
  //task
  runner.init();
  delay(50);
  runner.addTask(t1);
//  runner.addTask(t2);
//  delay(100);

  // Setup MQTT subscription for onoff feed.
  mqtt.subscribe(&onoffbutton);
  mqtt.subscribe(&openbt);
  t1.enable();
}

void loop() {
  // Ensure the connection to the MQTT server is alive (this will make the first
  // connection and automatically reconnect when disconnected).  See the MQTT_connect
  // function definition further below.
  MQTT_connect();

  // this is our 'wait for incoming subscription packets' busy subloop
  // try to spend your time here

  Adafruit_MQTT_Subscribe *subscription;
  int onoffstatus=0;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &onoffbutton) {
      Serial.print(F("Got onoffbutton: "));
      onoffstatus=atoi((char *)onoffbutton.lastread);
      Serial.println(onoffstatus);
      if (onoffstatus >= 1){
          set_powerOn();
      }else {
          set_powerOff();
      }

    }else if (subscription == &openbt) {
      Serial.print(F("Got openbt: "));
      onoffstatus=0;
      onoffstatus=atoi((char *)openbt.lastread);
      Serial.println(onoffstatus);
      if (onoffstatus >= 1){
          clickBtStart();
      }else
      {
          clickBtStop();
//          t2.setTimeout(120 * TASK_SECOND);
//          t2.enable();
      }
    }
    delay(100);
  }

  // Now we can publish stuff!

  runner.execute();
  // ping the server to keep the mqtt connection alive
  // NOT required if you are publishing once every KEEPALIVE seconds
  /*
  if(! mqtt.ping()) {
    mqtt.disconnect();
  }
  */
}

// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);  // wait 5 seconds
       retries--;
       if (retries == 0) {
         // basically die and wait for WDT to reset me
         while (1);
       }
  }
  Serial.println("MQTT Connected!");
}

arduino 模块

使用arduino有问题.请参考https://blog.csdn.net/solar_lan/article/category/9277412

python push 温度数据到zabbix中

要安装paho-mqtt模块

pip install paho-mqtt

import paho.mqtt.client as mqtt
import os
MQTTHOST = "xxx.com"
MQTTPORT = 1883
mqttClient = mqtt.Client()
mqttClient.username_pw_set('makeit', password='xxxx') 

# 连接MQTT服务器
def on_mqtt_connect():
    mqttClient.connect(MQTTHOST, MQTTPORT, 60)
    mqttClient.loop_start()

# publish 消息
def on_publish(topic, payload, qos):
    mqttClient.publish(topic, payload, qos)

# 消息处理函数
def on_message_come(lient, userdata, msg):
    os.system('zabbix_sender -c "C:\Program Files\Zabbix Agent\zabbix_agentd.conf" -k hwtemp -o'+str(int(msg.payload)))
    #print(msg.topic + " " + ":" + str(msg.payload))

# subscribe 消息
def on_subscribe():
    mqttClient.subscribe("makeit/#", 1)
    mqttClient.on_message = on_message_come # 消息到来处理函数

def main():
    on_mqtt_connect()
    #on_publish("makeit/server", "Hello Python!", 1)
    on_subscribe()
    while True:
        pass

if __name__ == '__main__':
    main()

zabbix设置请参考

https://www.cnblogs.com/lovesKey/p/10882510.html