m0_51677733 2023-11-11 12:24 采纳率: 87.5%
浏览 34
已结题

ESP8266使用按钮模块问题

开发板:ESP8266
传感器:1个tft屏幕,1个土壤湿度传感器,1个继电器传感器,3个按钮模块。
代码解释:获取土壤湿度数据化并显示,当湿度低于30%以下开启继电器5秒,用A1按钮增加湿度低于多少开启继电器,用A2按钮减少继电器开启时间,用A3切换更改哪条数据。
问题:3个按钮模块,程序上传后都无反应,实现想要的操作,请问如何解决。

img

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <TFT_eSPI.h> // 引入TFT屏幕库
#include <ESP8266WiFi.h> // 引入ESP8266WiFi库

#define Relay 5 // 定义继电器模块接口
#define Sensor A0 // 定义土壤湿度传感器接口
#define ButtonA1 16 // 按钮A1接口增加
#define ButtonA2 12 // 按钮A2接口减少
#define ButtonA3 3 // 按钮A3接口切换需要更改的项

TFT_eSPI tft = TFT_eSPI(); // 初始化TFT屏幕
int humidityThreshold = 30; // 定义湿度阈值
int relayOnTime = 5; // 定义继电器启动时间
bool selectHumidity = true; // 定义是否选择湿度

void setup() {

   Serial.begin(9600); // 启动串行通信,波特率为9600
  pinMode(Relay, OUTPUT); // 设置继电器模块为输出模式
  pinMode(Sensor, INPUT); // 设置土壤湿度传感器为输入模式
  
  pinMode(ButtonA1, INPUT_PULLUP); // 设置按钮A1为输入模式,并启用内部上拉电阻
  pinMode(ButtonA2, INPUT_PULLUP); // 设置按钮A2为输入模式,并启用内部上拉电阻
  pinMode(ButtonA3, INPUT_PULLUP); // 设置按钮A3为输入模式,并启用内部上拉电阻

  tft.init(); // 初始化TFT屏幕
  tft.setRotation(1); // 设置TFT屏幕方向
  tft.fillScreen(TFT_BLACK); // 设置屏幕背景颜色为黑色
  tft.setTextColor(TFT_WHITE); // 设置文本颜色为白色
}

void loop() {
 Serial.println(ButtonA2); // 在串行监视器上打印原始的模拟读数
  int sensorValue = analogRead(Sensor); // 读取土壤湿度传感器的值
  int humidity = map(sensorValue, 0, 1023, 10, 100); // 把传感器值映射到10%-100%之间
  if(humidity > 100) humidity = 100; // 如果湿度超过100%,则设置为100%

  tft.fillScreen(TFT_BLACK); // 清除屏幕
  tft.setCursor(0, 0); // 设置光标位置
  tft.println("turangshidu: " + String(humidity) + "%"); // 显示土壤湿度
  tft.println("shidu: " + String(humidityThreshold) + "%" + (selectHumidity ? " x" : "")); // 显示湿度阈值
  tft.println("shichang: " + String(relayOnTime) + "s" + (!selectHumidity ? " x" : "")); // 显示继电器启动时间

  if(digitalRead(ButtonA1) == LOW) { // 如果按下按钮A1
    if(selectHumidity && humidityThreshold < 80) humidityThreshold += 5; // 如果选择湿度,增加湿度阈值
    if(!selectHumidity && relayOnTime < 120) relayOnTime += 1; // 如果选择时间,增加继电器启动时间
  while (digitalRead(ButtonA1) == LOW) delay(10); // 等待按钮释放
  }

  if(digitalRead(ButtonA2) == LOW)  { // 如果按下按钮A2
    if(selectHumidity && humidityThreshold > 20) humidityThreshold -= 5; // 如果选择湿度,减少湿度阈值
    if(!selectHumidity && relayOnTime > 1) relayOnTime -= 1; // 如果选择时间,减少继电器启动时间
while (digitalRead(ButtonA2) == LOW) delay(10); // 等待按钮释放
  }

  if(digitalRead(ButtonA3) == LOW) { // 如果按下按钮A3
    selectHumidity = !selectHumidity; // 切换选择
    while (digitalRead(ButtonA3) == LOW) delay(10);
  }

  if(humidity < humidityThreshold) { // 如果土壤湿度低于阈值
    digitalWrite(Relay, HIGH); // 开启继电器模块
    delay(relayOnTime * 1000); // 延时继电器启动时间
    digitalWrite(Relay, LOW); // 关闭继电器模块
  } else {
    digitalWrite(Relay, LOW); // 如果土壤湿度不低于阈值,保持继电器关闭
  }
  //delay(1000); // 延时1秒,稳定读数
}

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-11-11 12:24
    关注

    引自强大而免费的微信小程序:皆我百晓生

    在这个代码中,你需要确保按钮模块正确连接到ESP8266的引脚,并且按钮模块的引脚模式正确设置为INPUT_PULLUP。

    如果你的按钮模块无反应,可以尝试以下操作:

    1. 确保按钮模块引脚正确连接到ESP8266引脚。可以使用示意图或引脚图来检查连接是否正确。

    2. 检查按钮模块是否配置为INPUT_PULLUP模式。在代码中使用pinMode函数将按钮引脚配置为INPUT_PULLUP模式。

    3. 确保按钮模块的连接线路没有断开或损坏。可以检查连接线路是否正确连接,并使用万用表检查引脚之间的连通性。

    4. 检查按钮模块是否正常工作。可以使用示例代码或调试代码来验证按钮模块是否输出正常。可以使用Serial输出来检查按钮模块的状态。

    5. 检查代码中的按钮检测部分是否正确。可以使用Serial输出来检查按钮模块的状态和按下事件。

    由于你只提供了代码的一部分,我无法得知其他可能的问题。如果上述操作无法解决问题,可以尝试提供更多的代码以便更好地理解你的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月12日
  • 创建了问题 11月11日