2017-08-06 9 views
-1

私はArduinoを初めて使用し、スレッドでプログラミングしています。 Arduinoで5つのボタンをプログラムしました。ボタンを押すと何かが起こります。 私はそのデータをC#で受信したいと考えています(C#はAdruinoから送信されたポートからデータを読み込みます)。 これにより、どのストップウォッチを開始するかを知ることができます。 ボタンを押すと、ストップウォッチが始まり、経過時間が連続して表示されます。 問題は、複数のボタンで動作させることができないことです。例えば、私はいつでも押すことができる5つのボタンを持っています。 しかし、現在のコードは1つのボタンしか扱えません。 私は数日間苦労しているので、あなたの助けに本当に感謝します。C#とArduinoがStopwatchクラスを使用してWinFormに時刻を表示

Arduinoのコード:

const int button1 = 3; 
const int button2 = 5; 

int counter1 = 0; 
int counter2 = 0; 

int buttonState1 = 0; 
int buttonState2 = 0; 


void setup() 
{ 
    pinMode(button1, INPUT); 
    pinMode(button2, INPUT); 
    Serial.begin(9600); 
} 

void loop() 
{ 
    buttonState1 = digitalRead(button1); 
    buttonState2 = digitalRead(button2); 

    // *** BUTTON 1 *** 
    if (buttonState1 == LOW && counter1==0) 
    { 
    //Serial.println("connected"); 
    counter1++; 
    delay(100); 
    } 
    else if (buttonState1 == HIGH && counter1==1) 
    { 
    //Serial.println("ready"); 
    counter1++; 
    delay(100); 
    } 
    else if(buttonState1 == LOW && counter1==2) 
    { 
    Serial.println("start"); 
    counter1++; 
    delay(100); 
    } 
    else if(buttonState1 == HIGH && counter1==3) 
    { 
    Serial.println("stop"); 
    counter1++; 
    delay(100); 
    } 


    // *** BUTTON 2 *** 
    if (buttonState2 == LOW && counter2 == 0) 
    { 
    //Serial.println("connected"); 
    counter2++; 
    delay(100); 
    } 
    else if (buttonState2 == HIGH && counter2 == 1) 
    { 
    //Serial.println("ready"); 
    counter2++; 
    delay(100); 
    } 
    else if(buttonState2 == LOW && counter2 == 2) 
    { 
    Serial.println("start2"); 
    counter2++; 
    delay(100); 
    } 
    else if(buttonState2 == HIGH && counter2 == 3) 
    { 
    Serial.println("stop2"); 
    counter2++; 
    delay(100); 
    } 
} 

C#コード:

Stopwatch stopwatch = new Stopwatch(); 
Stopwatch stopwatch2 = new Stopwatch(); 

// display time from first stopwatch 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    lblSec.Text = stopwatch.Elapsed.Minutes.ToString() + ":" + 
    stopwatch.Elapsed.Seconds.ToString() + "." + 
    stopwatch.Elapsed.Milliseconds.ToString(); 
} 

// display time from second stopwatch 
private void timer2_Tick(object sender, EventArgs e) 
{ 
    label1.Text = stopwatch2.Elapsed.Minutes.ToString() + ":" + 
    stopwatch2.Elapsed.Seconds.ToString() + "." + 
    stopwatch2.Elapsed.Milliseconds.ToString(); 
} 

編集:それは動作します。 ボタンを押すと、ポートを開いて新しいスレッドを開始します。ループは、ポートから来てストップウォッチを開始/停止する値をチェックします。

public void PortReadLine() 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     string portValue = myPort.ReadLine(); 
     switch (portValue) 
     { 
      case "start\r": 
       stopwatch.Start(); 
       break; 

      case "start2\r": 
       stopwatch2.Start(); 
       break; 

      case "stop\r": 
       stopwatch.Stop(); 
       break; 

      case "stop2\r": 
       stopwatch2.Stop(); 
       break; 
     } 
    } 
} 

private void button1_start_Click(object sender, EventArgs e) 
{ 
    myPort.BaudRate = 9600; 
    myPort.PortName = "COM3"; 
    myPort.Open(); 

    Thread threadPort = new Thread(PortReadLine); 
    threadPort.Start(); 
} 
+0

それではどちらが機能しますか?あなたのArduinoコードの関連する部分を見ることも参考になるかもしれません。これが問題であれば、私は答えに入れてもうれしいですが、Timer1とTimer2の両方を有効にして、それぞれのIntervalプロパティを設定しましたか? – TomServo

+0

最初にbutton1を押してからbutton2を押すと、最初に押されたためにbutton1だけが実行されます。最初にbutton2を押すと、button1は機能しません。私はArduinoコードを貼り付けた。はいタイマーが有効になり、動作します。 – dinkox

答えて

0

ボタンを押すとThreadMethodStop()初めてあなたはシリアルポートを無効にしているかのように見える、と呼ばれる:

if (data == "stop\r") 
{ 
    stopwatch.Stop(); 
    myPort.Close(); // <== here 
} 
if (data == "stop2\r") 
{ 
    stopwatch2.Stop(); 
    myPort.Close(); // <== and here 
} 

はコメント行にポートを閉じないようにしてください。

次に、あなたのcounter変数は状態を追跡しているように見えるが、ボタンが解放された後、範囲の外に出ると、loop()で何があなたの&&条件を満足する値に戻すん:

else if(buttonState2 == LOW && counter2 == 2) 
{ 
    Serial.println("start2"); 
    counter2++; 
    delay(100); 
} 
else if(buttonState2 == HIGH && counter2 == 3) 
{ 
    Serial.println("stop2"); 
    counter2++; 
    delay(100); 
} 

たとえば、counter2をインクリメントした後、その値は4になりますので、ifステートメントの条件を満たすことはできません。私はあなたが必要と思うので、あなたが必要と思う

else if(buttonState2 == HIGH && counter2 == 3) 
{ 
    Serial.println("stop2"); 
    counter2 = 2; // make ready to return to start2 condition OR 
    counter2 = 0; // return to initial state, do one of these... 
    delay(100); 
} 

もちろん、他のボタンのために同じ行います。

+0

私はポートをまったく閉じないようにしようとしましたが、まだ動作しません – dinkox

+0

私の編集した答えを見て、[これを見てください、ありがとう](https://stackoverflow.com/help/someone-answers) 。 – TomServo

+0

これはオプションです(私の考えはC#コード経由でカウンタをリセットすることです)、問題はC#コードにあります。私はArduinoからのデータを連続的に読み込み、同時にストップウォッチを実行し、リアルタイムで経過時間を表示する方法を知らない。これは、最初の反復(button1が機能しなかった後に押されるbutton2またはその逆)でのみ機能します。 – dinkox

関連する問題