2016-09-08 15 views
0

私は、GPIO13(およびグランド)に接続されたマイクロスイッチを備えたESP8266 ESP-12Eを持っています。シンプルなプログラム:押したボタンの長さと時間を送る方法は?

ESP8266からボタンを押したまま時間を計っている間、ボタンを押してから時間をカウントしています。ここで

は、私がこれまでにコード化されたものです:私はもう一度ボタンを押下する前に完了することが要求を待つ必要があるため

#include <ESP8266WiFi.h> 

long duration = 0; 
long startTime = 0; 

const char* ssid  = "SSID"; 
const char* password = "password"; 

void sendClick(int startTime, int duration) { 
    char* server = "192.168.0.15"; 
    Serial.println(server); 
    WiFiClient client; 
    if (client.connect(server,80)) { 
    String postStr = "id=1&time="; 
    postStr += String(startTime); 
    postStr +="&duration="; 
    postStr += String(duration); 
    postStr += "\n"; 
    client.print("POST /click HTTP/1.1\n"); 
    client.print("Host: "); 
    client.print(server); 
    client.print("\n"); 
    client.print("Connection: close\n"); 
    client.print("Content-Type: application/x-www-form-urlencoded\n"); 
    client.print("Content-Length: "); 
    client.print(postStr.length()); 
    client.print("\n\n"); 
    client.print(postStr); 
    client.stop(); 
    } 
} 

void setup() { 
    Serial.begin(115200); 
    pinMode(13, INPUT_PULLUP); 
    Serial.println(); 
    Serial.print("Connecting to "); 
    Serial.println(ssid); 

    WiFi.begin(ssid, password); 

    while (WiFi.status() != WL_CONNECTED) { 
    delay(500); 
    Serial.print("."); 
    } 

    Serial.println(""); 
    Serial.println("WiFi connected"); 
    Serial.println("IP address: "); 
    Serial.println(WiFi.localIP()); 
} 

void loop() { 
    if (digitalRead(13) == LOW) { 
    delay(25); //for eliminating microswitch's bounce 
    if (digitalRead(13) == LOW) { 
     duration = 25; 
     startTime = millis(); 
     while (digitalRead(13) == LOW) {} 
     duration += millis()-startTime; 
     Serial.print("Duration: "); 
     Serial.print(duration); 
     Serial.print(" startTime: "); 
     Serial.print(startTime); 
     Serial.print("\r\n"); 
     sendClick(startTime, duration); 
    } 
    } 
} 

はしかし、私のコードが間違っています。

私は割り込みを使用して、いくつかの配列にdurationstartTimeを置くことを考えている、例えば:

attachInterrupt(13, buttonClick, CHANGE); 

、その後、私は継続的配列は、新たなクリックが含まれているかどうかを確認し、サーバーに送信することができます。

しかし、それがうまくいくかどうか分かりませんし、一般的にはArduino/Cの経験があまりありません。どんな助けもありがとう。

答えて

0

ループ内で(while (digitalRead(13) == LOW) {})をブロックしません。それは不確定な時間の間、実行を保留しています。 Loopmainのようなものではなく、繰り返し呼び出され、ループ外(割り込みなど)で他のことが起こる可能性があるため、長時間ブロックすると悪い可能性があります。

ではなく、ループ内の状態の変化をテストします。このようなもの(未テスト):

if (button_is_currently_down() && !button_was_down) 
{ 
    // button has transitioned to "down" state 
    button_was_down = TRUE; 
    startTime = millis(); 
} 
else 
{ 
    if (button_was_down) { 
    // button has transitioned to "up" state 
    sendClick(startTime, millis() - startTime); 
    startTime = 0; 
    button_was_down = FALSE; 
    } 
} 
関連する問題