2017-04-07 154 views
0

我试图在我的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。

回答

0

保持一个布尔值来跟踪切换状态和一个布尔值,以保持按钮与前一个循环的状态。如果按钮从低到高循环迭代之间,然后直接上的按钮更新拨动布尔,

toggle = !togggle 

基地的条件显示状态然后切换代替。

+0

请您详细说明一下吗?..我只是一个初学者。如果你可以修改我的代码来添加切换状态,那将是很有用的。 –

1

这是要详细说明@ shaunussain的答案。

这里是一个切换的exampole:

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

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

如果按钮被按下

if(buttonPressed()) {

变化切换的状态。所以如果它是ON/TRUE,它将变成OFF/false。

toggle = !toggle; 

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

while (buttonPressed()); 
} 

然后在你的循环,你将有一个开关的情况下。我们首先对开关盒进行初始化。

switch(toggle) { 

然后我们设置了一个情况,当切换开启/关闭。 1为真,0为假。

case 1 : 

然后我们编写代码体。

displayTextOnScreen(); 

然后我们退出开关的情况下,因为toggle与我们的情况相匹配。

break; 

然后,如果我们toggle是不正确的,或者是其他的东西(因为在代码中的毛刺),我们将有一个默认的情况下。

default: 

在默认情况下,我们要在屏幕处于关闭状态,因此,如果它不假设是,或者如果有错误,它会关闭。然后我们将关闭开关盒并退出它,因为默认是开关盒的最后一种情况。

display.clearDisplay(); 
} 
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(); 



} 
+0

很高兴你能够让这个概念真正起作用,没有任何示例代码可以方便地分享,但是很好,你可以从概念到实现,使用while循环保持锁定的有趣想法,直到按钮为止也发布了。 – shaunhusain

+0

请勿使用情况0,请使用默认值。这是因为如果代码中有任何错误,什么都不会发生。 –