使用按钮启动/停止功能

时间:2017-04-07 16:01:56

标签: 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 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中switch case的用法。

3 个答案:

答案 0 :(得分:1)

你要详细说明@ shaunussain的答案。

以下是切换的例子:

创建一个布尔变量:bool toggle = false;变量状态在开头为false。因此,屏幕将开始为空白。

然后做这样的事情。这只是一个逻辑。

如果按下按钮

if( buttonPressed() ) {

更改切换状态。因此,如果它是ON / true,它将变为OFF / false。

    toggle = !toggle;

现在,我们等到按钮被释放,否则代码可能会有点疯狂!然后我们关闭括号。

    while ( buttonPressed() );
}

然后在你的循环中,你将有一个开关盒。我们首先将开关盒初始化。

switch( toggle ) {

然后我们设置一个案例,用于当切换开启ON / true时。 1为真,0为假。

case  1 :

然后我们编写代码体。

    displayTextOnScreen();

然后我们退出switch case,因为toggle与我们的案例匹配。

    break;

然后,如果我们toggle不是真的,或者它是其他东西(因为代码中有一个小故障),我们将有一个默认情况。

default:

在默认情况下,我们希望屏幕关闭,因此如果它没有打开,或者如果有错误,它将会关闭。然后我们将关闭开关盒并退出它,因为默认是开关盒中的最后一种情况。

    display.clearDisplay();
}

答案 1 :(得分:1)

非常感谢,这对我帮助很大。代码工作正常。更新的代码:

    #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();



 }

答案 2 :(得分:0)

保持一个布尔值以跟踪切换状态和一个布尔值以保持按钮的状态不受前一个循环的影响。如果循环迭代之间按钮从低到高,则更新切换布尔值

toggle = !togggle

根据显示状态确定条件,然后在切换上,而不是直接在按钮上。