私は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();
}
それではどちらが機能しますか?あなたのArduinoコードの関連する部分を見ることも参考になるかもしれません。これが問題であれば、私は答えに入れてもうれしいですが、Timer1とTimer2の両方を有効にして、それぞれのIntervalプロパティを設定しましたか? – TomServo
最初にbutton1を押してからbutton2を押すと、最初に押されたためにbutton1だけが実行されます。最初にbutton2を押すと、button1は機能しません。私はArduinoコードを貼り付けた。はいタイマーが有効になり、動作します。 – dinkox