0

GPIO13(およびグランド)に接続されたマイクロスイッチを備えたESP8266 ESP-12Eがあります。

ボタンを押している時間と、ESP8266 の開始からボタンが押されるまでの時間のカウントを送信します (できれば HTTP POST を使用しますが、選択が悪い場合は別のものを受け入れます)。

これまでにコーディングしたものは次のとおりです。

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

ただし、ボタンをもう一度押す前にリクエストが完了するのを待つ必要があるため、私のコードは間違っています。

割り込みを使用していくつかの配列を配置することdurationを考えています。startTime

attachInterrupt(13, buttonClick, CHANGE);

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

しかし、それがうまくいくかどうかはわかりませんし、一般的にArduino / Cの経験が少なすぎます。どんな助けでも大歓迎です。

4

1 に答える 1

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;
  }
}
于 2016-09-09T12:36:21.063 に答える