2017-04-07 203 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,請使用默認值。這是因爲如果代碼中有任何錯誤,什麼都不會發生。 –