Button 使用按钮启动/停止功能
我试图在我的0.96 Adafruit OLED上显示LDR的读数。我成功地取得了这一成果。 现在,我只想在按下按钮时开始显示读数,再次按下按钮时停止显示读数。这应该是一个循环。 我试图为此起草一份代码:Button 使用按钮启动/停止功能,button,arduino,Button,Arduino,我试图在我的0.96 Adafruit OLED上显示LDR的读数。我成功地取得了这一成果。 现在,我只想在按下按钮时开始显示读数,再次按下按钮时停止显示读数。这应该是一个循环。 我试图为此起草一份代码: #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> int sensorPin = A0; // select th
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
int sensorPin = A0; // select the input pin for ldr
int sensorValue = 0;
boolean state = false;
int buttonpin;
#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
char inChar;
String string;
void setup() {
pinMode(13, OUTPUT);
buttonpin = 2; //whatever pin your button is plugged into
pinMode(buttonpin, INPUT_PULLUP);
// initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.begin(9600);
display.display();
delay(2000);
display.clearDisplay();
display.setTextColor(INVERSE);
}
void loop()
{
while (state == false)
{
if (digitalRead(buttonpin) == HIGH)
{
display.clearDisplay();
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
display.setCursor(30,0);
display.setTextSize(1);
display.print("LDR Reading:");
display.setCursor(30,10);
display.setTextSize(2);
display.print(sensorValue);
delay(500);
display.display();
state = false;
}
}
}
但只有当我持续按下按钮时,屏幕才开始显示结果,当我松开按钮时,程序停止,屏幕上显示最后一个读数
我需要的结果如下:
第一次按下:开始显示读数
第二次按下:屏幕应为空白。display.clearDisplay做这个工作
我不熟悉Arduino中开关大小写的用法。保留一个布尔值以跟踪切换状态,保留一个布尔值以从上一个循环中保留按钮的状态。如果按钮在循环迭代之间从低到高,则更新切换布尔值
toggle = !togggle
将显示状态的条件基于切换,而不是直接基于按钮。保留一个布尔值以跟踪切换状态,保留一个布尔值以从上一个循环中保留按钮的状态。如果按钮在循环迭代之间从低到高,则更新切换布尔值
toggle = !togggle
根据显示状态的条件,然后按切换键,而不是直接按按钮。这将详细说明@Shaunusain的答案 以下是切换的一个示例: 创建一个布尔变量:bool toggle=false;变量状态在开始时为false。因此,屏幕将开始空白 那就这样做吧。这只是一种逻辑 如果按下按钮 如果按下按钮{ 更改切换的状态。因此,如果它是ON/true,它将更改为OFF/false
toggle = !toggle;
现在,我们等待按钮被释放,否则代码可能会有点疯狂!然后我们关闭括号
while ( buttonPressed() );
}
然后在你的循环中,你将有一个开关盒。我们首先开始对开关盒进行初始化
switch( toggle ) {
display.clearDisplay();
}
然后,我们设置了一个切换为on/true的情况。1为true,0为false
case 1 :
然后我们编写代码体
displayTextOnScreen();
然后我们退出开关盒,因为开关与我们的盒匹配
break;
然后,如果切换不正确,或者是因为代码中出现了故障而导致的其他情况,那么我们将使用默认情况
default:
在默认情况下,我们希望屏幕处于关闭状态,因此如果它不应该处于打开状态,或者如果存在错误,它将处于关闭状态。然后我们将关闭开关箱并退出它,因为默认情况是开关箱中最后一种可能的情况
switch( toggle ) {
display.clearDisplay();
}
这将详细说明@Shaunusain的答案 以下是切换的一个示例: 创建一个布尔变量:bool toggle=false;变量状态在开始时为false。因此,屏幕将开始为空白 那就这样做,这只是个逻辑 如果按下按钮 如果按下按钮{ 更改切换的状态。因此,如果它是ON/true,它将更改为OFF/false
toggle = !toggle;
现在,我们等待按钮被释放,否则代码可能会有点疯狂!然后我们关闭括号
while ( buttonPressed() );
}
然后在你的循环中,你将有一个开关盒。我们首先开始对开关盒进行初始化
switch( toggle ) {
display.clearDisplay();
}
然后,我们设置了一个切换为on/true的情况。1为true,0为false
case 1 :
然后我们编写代码体
displayTextOnScreen();
然后我们退出开关盒,因为开关与我们的盒匹配
break;
然后,如果切换不正确,或者是因为代码中出现了故障而导致的其他情况,那么我们将使用默认情况
default:
在默认情况下,我们希望屏幕处于关闭状态,因此如果它不应该处于打开状态,或者如果存在错误,它将处于关闭状态。然后我们将关闭开关箱并退出它,因为默认情况是开关箱中最后一种可能的情况
switch( toggle ) {
display.clearDisplay();
}
非常感谢,这对我帮助很大。代码运行良好。更新代码:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
int sensorPin = A0; // select the input pin for ldr
int sensorValue = 0;
bool toggle = false;
int buttonpin;
#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
char inChar;
String string;
void setup() {
pinMode(13, OUTPUT);
buttonpin = 2;
pinMode(buttonpin, INPUT_PULLUP);
// initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.begin(9600);
display.display();
delay(2000);
display.clearDisplay();
display.setTextColor(INVERSE);
}
void loop()
{
if (digitalRead(buttonpin) == HIGH)
{
toggle = !toggle;
while(digitalRead(buttonpin) == HIGH);
}
switch( toggle )
{
case 1:
display.clearDisplay();
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
display.setCursor(30,0);
display.setTextSize(1);
display.print("LDR Reading:");
display.setCursor(30,10);
display.setTextSize(2);
display.print(sensorValue);
delay(500);
break;
case 0:
display.clearDisplay();
break;
}
display.display();
}
非常感谢,这对我帮助很大。代码运行良好。更新代码:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
int sensorPin = A0; // select the input pin for ldr
int sensorValue = 0;
bool toggle = false;
int buttonpin;
#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
char inChar;
String string;
void setup() {
pinMode(13, OUTPUT);
buttonpin = 2;
pinMode(buttonpin, INPUT_PULLUP);
// initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.begin(9600);
display.display();
delay(2000);
display.clearDisplay();
display.setTextColor(INVERSE);
}
void loop()
{
if (digitalRead(buttonpin) == HIGH)
{
toggle = !toggle;
while(digitalRead(buttonpin) == HIGH);
}
switch( toggle )
{
case 1:
display.clearDisplay();
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
display.setCursor(30,0);
display.setTextSize(1);
display.print("LDR Reading:");
display.setCursor(30,10);
display.setTextSize(2);
display.print(sensorValue);
delay(500);
break;
case 0:
display.clearDisplay();
break;
}
display.display();
}
你能详细说明吗?我只是一个初学者。如果你能修改我的代码来添加切换状态,你会很感激的。你能详细说明吗?我只是一个初学者。如果你能修改我的代码来添加切换状态,你会很感激的。很高兴你能让这个概念真正起作用,手头没有任何示例代码分享但很好,你能够从概念到实现,有趣的想法是使用while循环在按钮释放之前保持锁定。不要使用用例0,使用默认值。这是因为如果代码中有任何错误,什么都不会发生。Sweet很高兴你能够使这个概念真正工作,没有任何sample代码便于共享,但很好,您能够将其从概念到实现,这是一个有趣的想法,使用while循环将其锁定,直到按钮被释放。不要使用案例0,使用默认值。这是因为如果代码中有任何错误,将不会发生任何事情。