用巴法云可以控制LED和继电器,DS18B20打印温度正常,目前为解决的就是无法对温度进行比较(比如温度小于18摄氏度就开启继电器1,温度小于23摄氏度就开启继电器2),下面加粗的文字就是需要修改的
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//巴法云服务器地址默认即可
#define TCP_SERVER_ADDR "bemfa.com"
//服务器端口,tcp创客云端口8344
#define TCP_SERVER_PORT "8344"
//********************需要修改的部分*******************//
//WIFI名称,区分大小写,不要写错
#define DEFAULT_STASSID "2405"
//WIFI密码
#define DEFAULT_STAPSW "HD19980506"
//用户私钥,可在控制台获取,修改为自己的UID
String UID = "****************";
//主题名字,可在控制台新建
String TOPIC1 = "fish0002"; //主题名字,可在控制台新建
String TOPIC2 = "fish1002"; //主题名字,可在控制台新建
String TOPIC3 = "fish2002"; //主题名字,可在控制台新建
String TOPIC4 = "fish3002"; //主题名字,可在控制台新建
const int LED_Pin = 0; //单片机LED引脚值,GPIO0引脚
const int RWLAY0_Pin = 16; //单片机RWLAY0引脚值,GPIO0引脚
const int RELAY1_Pin = 4; //单片机继电器引脚值,GPIO0引脚
const int RELAY2_Pin = 5; //单片机继电器引脚值,GPIO0引脚
#define ONE_WIRE_BUS 2 // 定义DS18B20数据口连接arduino的 2 脚
#define Alarm_low 18 // 定义DS18B20数据低于18℃
#define Alarm_high 24 // 定义DS18B20数据高于23℃
OneWire oneWire(ONE_WIRE_BUS); // 初始连接在单总线上的单总线设备
DallasTemperature sensors(&oneWire);
#define Alarm_low 18 // 定义DS18B20数据低于18℃
#define Alarm_high 23 // 定义DS18B20数据高于23℃
//**************************************************//
void isAlarm(){
if(sensors.getTempCByIndex(0) < Alarm_low){
digitalWrite(RWLAY0_Pin,LOW);
}else if(sensors.getTempCByIndex(0) > Alarm_high){
digitalWrite(RELAY1_Pin,LOW);
}else{
digitalWrite(RWLAY0_Pin,HIGH);
digitalWrite(RELAY1_Pin,HIGH);
}
}
//最大字节数
#define MAX_PACKETSIZE 512
//设置心跳值30s
#define KEEPALIVEATIME 30*1000
//tcp客户端相关初始化,默认即可
WiFiClient TCPclient;
String TcpClient_Buff = "";
unsigned int TcpClient_BuffIndex = 0;
unsigned long TcpClient_preTick = 0;
unsigned long preHeartTick = 0;//心跳
unsigned long preTCPStartTick = 0;//连接
bool preTCPConnected = false;
//相关函数初始化
//连接WIFI
void doWiFiTick();
void startSTA();
//TCP初始化连接
void doTCPClientTick();
void startTCPClient();
void sendtoTCPServer(String p);
//风扇控制函数
void turnOn();
void turnOff();
/*
*发送数据到TCP服务器
*/
void sendtoTCPServer(String p){
if (!TCPclient.connected())
{
Serial.println("Client is not readly");
return;
}
TCPclient.print(p);
Serial.println("[Send to TCPServer]:String");
Serial.println(p);
}
/*
*初始化和服务器建立连接
*/
void startTCPClient(){
if(TCPclient.connect(TCP_SERVER_ADDR, atoi(TCP_SERVER_PORT))){
Serial.print("\nConnected to server:");
Serial.printf("%s:%d\r\n",TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT));
String subStr="";
subStr = "cmd=1&uid="+UID+"&topic="+TOPIC1+"\r\n";
sendtoTCPServer(subStr);
subStr = "";
subStr = "cmd=1&uid="+UID+"&topic="+TOPIC2+"\r\n";
sendtoTCPServer(subStr);
subStr = "";
subStr = "cmd=1&uid="+UID+"&topic="+TOPIC3+"\r\n";
sendtoTCPServer(subStr);
subStr = "";
subStr = "cmd=1&uid="+UID+"&topic="+TOPIC4+"\r\n";
sendtoTCPServer(subStr);
subStr = "";
preTCPConnected = true;
preHeartTick = millis();
TCPclient.setNoDelay(true);
}
else{
Serial.print("Failed connected to server:");
Serial.println(TCP_SERVER_ADDR);
TCPclient.stop();
preTCPConnected = false;
}
preTCPStartTick = millis();
}
/*
*检查数据,发送心跳
*/
void doTCPClientTick(){
//检查是否断开,断开后重连
if(WiFi.status() != WL_CONNECTED) return;
if (!TCPclient.connected()) {//断开重连
if(preTCPConnected == true){
preTCPConnected = false;
preTCPStartTick = millis();
Serial.println();
Serial.println("TCP Client disconnected.");
TCPclient.stop();
}
else if(millis() - preTCPStartTick > 1*1000)//重新连接
startTCPClient();
}
else
{
if (TCPclient.available()) {//收数据
char c =TCPclient.read();
TcpClient_Buff +=c;
TcpClient_BuffIndex++;
TcpClient_preTick = millis();
if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){
TcpClient_BuffIndex = MAX_PACKETSIZE-2;
TcpClient_preTick = TcpClient_preTick - 200;
}
preHeartTick = millis();
}
if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳
preHeartTick = millis();
Serial.println("--Keep alive:");
sendtoTCPServer("cmd=0&msg=keep\r\n");
}
}
if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200))
{//data ready
TCPclient.flush();
Serial.println("Buff");
Serial.println(TcpClient_Buff);
if((TcpClient_Buff.indexOf("&msg=on") > 0)) {
if(TcpClient_Buff.indexOf(TOPIC1) > 0){
turnOnLED();//topic1开 LED开
}else if(TcpClient_Buff.indexOf(TOPIC2) > 0){
turnOnRWLAY0();//topic2开 RWLAY0开
}else if(TcpClient_Buff.indexOf(TOPIC3) > 0){
turnOnRELAY1();//topic3开 继电器1开
}else if(TcpClient_Buff.indexOf(TOPIC4) > 0){
turnOnRELAY2();//topic4开 继电器2开
}
}else if((TcpClient_Buff.indexOf("&msg=off") > 0)) {
if(TcpClient_Buff.indexOf(TOPIC1) > 0){
turnOffLED();//topic1关 风扇关
}else if(TcpClient_Buff.indexOf(TOPIC2) > 0){
turnOffRWLAY0();//topic2关 灯关
}else if(TcpClient_Buff.indexOf(TOPIC3) > 0){
turnOffRELAY1();//topic2关 灯关
}else if(TcpClient_Buff.indexOf(TOPIC4) > 0){
turnOffRELAY2();//topic2关 灯关
}
}
TcpClient_Buff="";
TcpClient_BuffIndex = 0;
}
}
void startSTA(){
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW);
}
/**************************************************************************
WIFI
***************************************************************************/
/*
WiFiTick
检查是否需要初始化WiFi
检查WiFi是否连接上,若连接成功启动TCP Client
控制指示灯
*/
void doWiFiTick(){
static bool startSTAFlag = false;
static bool taskStarted = false;
static uint32_t lastWiFiCheckTick = 0;
if (!startSTAFlag) {
startSTAFlag = true;
startSTA();
Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap());
}
//未连接1s重连
if ( WiFi.status() != WL_CONNECTED ) {
if (millis() - lastWiFiCheckTick > 1000) {
lastWiFiCheckTick = millis();
}
}
//连接成功建立
else {
if (taskStarted == false) {
taskStarted = true;
Serial.print("\r\nGet IP Address: ");
Serial.println(WiFi.localIP());
startTCPClient();
}
}
}
//打开风扇
void turnOnLED(){
Serial.println("LED Turn ON");
digitalWrite(LED_Pin,LOW);
}
//关闭风扇
void turnOffLED(){
Serial.println("LED Turn OFF");
digitalWrite(LED_Pin,HIGH);
}
//打开灯泡
void turnOnRWLAY0(){
Serial.println("RWLAY0 Turn ON");
digitalWrite(RWLAY0_Pin,LOW);
}
//关闭灯泡
void turnOffRWLAY0(){
Serial.println("RWLAY0 Turn OFF");
digitalWrite(RWLAY0_Pin,HIGH);
}
//打开灯泡
void turnOnRELAY1(){
Serial.println("RELAY1 Turn ON");
digitalWrite(RELAY1_Pin,LOW);
}
//关闭灯泡
void turnOffRELAY1(){
Serial.println("RELAY1 Turn OFF");
digitalWrite(RELAY1_Pin,HIGH);
}
//打开灯泡
void turnOnRELAY2(){
Serial.println("RELAY2 Turn ON");
digitalWrite(RELAY2_Pin,LOW);
}
//关闭灯泡
void turnOffRELAY2(){
Serial.println("RELAY2 Turn OFF");
digitalWrite(RELAY2_Pin,HIGH);
}
// 初始化,相当于main 函数
void setup() {
sensors.begin(); // 初始库
Serial.begin(115200);
pinMode(LED_Pin,OUTPUT); //设置引脚模式为输出
digitalWrite(LED_Pin,HIGH); //默认输出高电平
pinMode(RWLAY0_Pin,OUTPUT);//设置引脚模式为输出
digitalWrite(RWLAY0_Pin,HIGH);//默认输出高电平
pinMode(RELAY1_Pin,OUTPUT);//设置引脚模式为输出
digitalWrite(RELAY1_Pin,HIGH);//默认输出高电平
pinMode(RELAY2_Pin,OUTPUT);//设置引脚模式为输出
digitalWrite(RELAY2_Pin,HIGH);//默认输出高电平
}
//循环
void loop() {
doWiFiTick();
doTCPClientTick();
sensors.requestTemperatures(); // 发送命令获取温度
Serial.print("温度值:"); //串口打印温度值
Serial.print(sensors.getTempCByIndex(0));
Serial.println("℃");
delay(2000);
}
黑色部分改成
#define Alarm_low 18 // 定义DS18B20数据低于18℃
#define Alarm_high 23 // 定义DS18B20数据高于23℃
//**************************************************//
void isAlarm(){
if(sensors.getTempCByIndex(0) < Alarm_low){
turnOnLED();
turnOffRWLAY0();
}else if(sensors.getTempCByIndex(0) > Alarm_high){
turnOnRWLAY0();
turnOffLED();
}else{
turnOffLED();
turnOffRWLAY0();
}
}
还是不行,当温度大于23度还是未开启fish1002
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632