Button 使用按钮启动/停止功能

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

我试图在我的0.96 Adafruit OLED上显示LDR的读数。我成功地取得了这一成果。 现在,我只想在按下按钮时开始显示读数,再次按下按钮时停止显示读数。这应该是一个循环。 我试图为此起草一份代码:

#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,使用默认值。这是因为如果代码中有任何错误,将不会发生任何事情。