按键控制LED失败咋回事呢,接线没问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1562|回复: 12

[未解决] 按键控制LED失败咋回事呢,接线没问题

[复制链接]
发表于 2022-4-20 22:48 | 显示全部楼层 |阅读模式
最开始做的是DHT11温湿度传感器采集数据显示在!12864OLED上,后来想往上加功能(比如按键控制温度门限将来再报警啥的),但是不知道为啥想加一个按键就卡在这一步了代码奉上
  1. /*

  2. * 温湿度OLED显示+门限开关+继电器开关

  3. */

  4. #include <dht11.h>

  5. dht11 DHT11;

  6. #define DHT11PIN 7  //DHT11引脚设在digital 7



  7. int button1Pin = 22;

  8. int ledRedPin = 30;

  9. boolean ledRedState=false;  // 记录LED状态

  10. boolean button1State=true;  // 记录按键状态





  11. #include <U8g2lib.h>//oled12864驱动库

  12. //#include <Wire.h>//硬件 I2C (基于Arduino Wire库)



  13. /* OLED构造函数 */

  14. U8G2_SSD1306_128X64_NONAME_F_HW_I2C  u8g2(U8G2_R0);



  15. void setup() {

  16.   Serial.begin(9600);  //设置波特率参数



  17.   pinMode(button1Pin, INPUT);

  18.   pinMode(ledRedPin,OUTPUT);



  19.   u8g2.enableUTF8Print();//引用utf-8Unicode

  20.   u8g2.begin();   //初始化

  21.   

  22. }



  23. void loop() {

  24.   u8g2.clearBuffer();   // 清空显示设备内部缓冲区

  25.   Serial.println("\n");

  26.   /*检查程序*/

  27.   int chk = DHT11.read(DHT11PIN);

  28.   Serial.print("Read sensor: ");

  29.   switch (chk)

  30.   {

  31.     case DHTLIB_OK:

  32.                 Serial.println("OK");

  33.                 break;

  34.     case DHTLIB_ERROR_CHECKSUM:

  35.                 Serial.println("Checksum error");

  36.                 break;

  37.     case DHTLIB_ERROR_TIMEOUT:

  38.                 Serial.println("Time out error");

  39.                 break;

  40.     default:

  41.                 Serial.println("Unknown error");

  42.                 break;

  43.   }

  44.   Serial.print("Humidity (%): ");

  45.   Serial.println((float)DHT11.humidity, 2);   //串口打印湿度



  46.   Serial.print("Temperature (oC): ");

  47.   Serial.println((float)DHT11.temperature, 2);  //串口打印温度

  48.   

  49.   delay(500);//延时



  50.   /*OLED屏幕打印*/

  51. //  u8g2.setFont(u8g2_font_liqingtang);

  52.   u8g2.setFont(u8g2_font_liqingtang);

  53.   u8g2.setFontDirection(0); //旋转图像预设值

  54.   u8g2.clearBuffer();

  55.   float tem = (float)DHT11.temperature;

  56.   u8g2.setCursor(0,16);  //设置打印的光标位置

  57.   u8g2.print("温度 ");

  58.   u8g2.print(tem);

  59.   u8g2.print(" oC");

  60.   

  61.   u8g2.setCursor(0,32);  //设置打印的光标位置.

  62.   u8g2.print("湿度 ");

  63.   u8g2.print((float)DHT11.humidity);

  64.   u8g2.print(" %");



  65.   u8g2.setCursor(0,48);  //设置打印的光标位置.

  66.   u8g2.print("李庆堂");

  67.   

  68.   u8g2.sendBuffer();  //发送buffer缓冲区的内容到显示器



  69.   while(digitalRead(button1Pin)==HIGH){}

  70.   // 当按键按下时,点亮或熄灭LED

  71.   if(ledRedState==true)

  72.   {

  73.     digitalWrite(ledRedPin,LOW);

  74.     ledRedState=!ledRedState;

  75.   }

  76.   else

  77.   {

  78.     digitalWrite(ledRedPin,HIGH);

  79.     ledRedState=!ledRedState;

  80.   }

  81.   

  82.   

  83.   delay(500);

  84.   



  85. }
复制代码
接线比较乱,我把想做的都接上了,现在准备一点点加上这些功能。

接线

接线
发表于 2022-4-22 13:52 | 显示全部楼层
liqingtang 发表于 2022-4-22 12:49
不知道为什么,虽然while()里面没有东西,但是注释掉while,灯就会一闪一闪的。 ...

while(digitalRead(button1Pin)==HIGH){}。你的while()里有东西呀,就是当按键没按下时,按键引脚GPIO高电平 , 程序在那里等待。当按下时,GPIO低电平,执行while语句下一条
发表于 2022-4-21 18:38 | 显示全部楼层
本帖最后由 47okey 于 2022-4-21 18:41 编辑

按键要上拉
代码 pinMode(button1Pin, INPUT);改成 pinMode(button1Pin, INPUT_PULLUP);
发表于 2022-4-21 01:07 | 显示全部楼层
while(digitalRead(button1Pin)==HIGH){}

{} 裏面沒有任何程式碼,條件成立=什麼事都沒做
後面的 if else 會在每次執行時自行切換狀態並暫停
0.5 秒(這會嚴重拖慢系統執行效率吧?)
 楼主| 发表于 2022-4-20 22:49 | 显示全部楼层
按键部分在代码最后那段
发表于 2022-4-21 01:13 | 显示全部楼层
简单的看了一下,应该是按钮没有下拉电阻
我也不知道说的对不对,也刚开始学
1.jpg
2.jpg
发表于 2022-4-21 02:36 | 显示全部楼层
数字引脚一端加一个10k的电阻,我也不知道为什么要用10k的
3.jpg
4.png
 楼主| 发表于 2022-4-22 09:11 | 显示全部楼层
47okey 发表于 2022-4-21 18:38
按键要上拉
代码 pinMode(button1Pin, INPUT);改成 pinMode(button1Pin, INPUT_PULLUP);

好的,我试试
 楼主| 发表于 2022-4-22 09:15 | 显示全部楼层
linv2 发表于 2022-4-21 02:36
数字引脚一端加一个10k的电阻,我也不知道为什么要用10k的

下面有人评论说代码 pinMode(button1Pin, INPUT);改成 pinMode(button1Pin, INPUT_PULLUP);
用PULLUP输入上拉模式好像会内置一个10kΩ的电阻,试了一下按键控制成了,还不清楚书里下拉和上拉的区别
 楼主| 发表于 2022-4-22 12:49 | 显示全部楼层
shouzama 发表于 2022-4-21 01:07
{} 裏面沒有任何程式碼,條件成立=什麼事都沒做
後面的 if else 會在每次執行時自行切換狀態並暫停
0.5 秒( ...

不知道为什么,虽然while()里面没有东西,但是注释掉while,灯就会一闪一闪的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 07:39 , Processed in 0.211540 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表