Arduinoを利用して工作を始めました。
本を見ながら、LEDが点滅できる様になりました。
やってみたいことは、タイマー動作です。
電源を入れると3分でカウントスタートして、プッシュスイッチを押した時は、1、3分と切り替える様にしたいです。
どちらのモードで動いているのか、わかる様にLEDで表示したい。
タイマー終了30秒前にブザーを鳴らしたい。
よろしくお願いします。
arduinoのプログラムについて
Re: arduinoのプログラムについて
なるほど、目標を持つことはいいことです。
しかし、ここは質問掲示板です。
雑談をする場合は、タイトルの最後に[雑談]と入れてください。
また、ユーザー登録をしてログインしていただけると、日記が書けるようになります。
ここにはあなたのやりたいことは書かれていますが、質問も「条件を満たすコードをくれ」という(あまり歓迎されない)お願いも見当たりません。
質問をする場合は、フォーラムルール、特にそこに書かれている以下のテンプレを参考にするといいでしょう。
また、[1] 質問文のうち[1.1]は「タイマー動作」と書かれていますが、それ以外が見当たらないようです。
そのため、自分にとってこの投稿は質問であるとはみなせません。
しかし、ここは質問掲示板です。
雑談をする場合は、タイトルの最後に[雑談]と入れてください。
また、ユーザー登録をしてログインしていただけると、日記が書けるようになります。
ここにはあなたのやりたいことは書かれていますが、質問も「条件を満たすコードをくれ」という(あまり歓迎されない)お願いも見当たりません。
質問をする場合は、フォーラムルール、特にそこに書かれている以下のテンプレを参考にするといいでしょう。
環境はArduinoとありますが、ArduinoにはUNO、MEGAなど多くの種類があります。どれでしょうか?[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか
[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
また、[1] 質問文のうち[1.1]は「タイマー動作」と書かれていますが、それ以外が見当たらないようです。
そのため、自分にとってこの投稿は質問であるとはみなせません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: arduinoのプログラムについて
プログラムの記載方法がよく理解できていませんが、少しづつ進めて完成を目指しています。
ブザー、ベルはリレーを駆動して鳴らすようにしています。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
タイマーを動作させるにあたり、どのようにプログラムを書けば良いのかわかりません。
delay を使うと処理が止まって、ボタンを押しても反応しない。
タイマー動作がクリア出来して先に進むことができれば、トグルスイッチを追加して、時間を選択できる様にしていきたいです。
スイッチにはプルアップまたは、プルダウン抵抗は必要ですか?
[2] 環境
[2.1] OS : Windows10
[2.2] コンパイラ名 : sketch_nov18a arduion1.7.11
現状はこんな感じです。よろしくお願いします、ご教授ください。
ブザー、ベルはリレーを駆動して鳴らすようにしています。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
void setup()
// put your setup code here, to run once:
{
pinMode(8, OUTPUT); // LED1 1分
pinMode(9, OUTPUT); // LED2 3分
pinMode(10, OUTPUT); // ブザー
pinMode(11, OUTPUT); // ベル
pinMode(2,INPUT); // プッシュスイッチ
pinMode(3,INPUT); // 予備
pinMode(4,INPUT); // 予備
pinMode(5,INPUT); // 予備
pinMode(6,INPUT); // 予備
}
void loop()
{
// put your main code here, to run repeatedly:
if(digitalRead(2)==LOW)
digitalWrite(8),HIGH);
digitalWrite(9),LOW);
delay (30000)
digitalWrite(10),HIGH);
delay (1000)
digitalWrite(10),LOW);
delay (30000)
digitalWrite(11),HIGH);
delay (2)
digitalWrite(11),LOW);
else
digitalWrite(8),LOW);
digitalWrite(9),HIGH);
delay (150000)
digitalWrite(10),HIGH);
delay (1000)
digitalWrite(10),LOW);
delay (30000)
digitalWrite(11),HIGH);
delay (2)
digitalWrite(11),LOW);
}
タイマーを動作させるにあたり、どのようにプログラムを書けば良いのかわかりません。
delay を使うと処理が止まって、ボタンを押しても反応しない。
タイマー動作がクリア出来して先に進むことができれば、トグルスイッチを追加して、時間を選択できる様にしていきたいです。
スイッチにはプルアップまたは、プルダウン抵抗は必要ですか?
[2] 環境
[2.1] OS : Windows10
[2.2] コンパイラ名 : sketch_nov18a arduion1.7.11
現状はこんな感じです。よろしくお願いします、ご教授ください。
Re: arduinoのプログラムについて
millis()で時刻を求め、今の時刻-開始時刻で時間がわかるので、時間が条件を満たしたらアクションを起こすようにプログラムを書けばいいです。white255 さんが書きました:タイマーを動作させるにあたり、どのようにプログラムを書けば良いのかわかりません。
delay を使うと処理が止まって、ボタンを押しても反応しない。
Arduinoの機能でプルアップできるので、外部の抵抗は必要ないはずです。white255 さんが書きました:タイマー動作がクリア出来して先に進むことができれば、トグルスイッチを追加して、時間を選択できる様にしていきたいです。
スイッチにはプルアップまたは、プルダウン抵抗は必要ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: arduinoのプログラムについて
millis() を使って時間で点滅させる事はできました。
下記のプログラムで設定時間された時間の予告時間前になったら(5秒くらいの出力)をして設定時間まで処理しその後繰り返すには、どのようにすれば出来ますか?
(15秒の設定ならば終了5秒前に予告出力させたいです)
うまく説明出来ずすみません
下記のプログラムで設定時間された時間の予告時間前になったら(5秒くらいの出力)をして設定時間まで処理しその後繰り返すには、どのようにすれば出来ますか?
(15秒の設定ならば終了5秒前に予告出力させたいです)
うまく説明出来ずすみません
long beforetime = 0;
#define LEDA 13
#define LEDB 12 // 予告用出力
unsigned long time; //設定時間
unsigned long yokoku; //予告時間
void setup()
{
pinMode(LEDA, OUTPUT);
}
void loop()
{
time = 15000 ; //設定時間
unsigned long yokoku = 5000; //予告時間
if (millis() - beforetime > time) {
beforetime = millis();
if (digitalRead(13) == LOW)
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
}
}
Re: arduinoのプログラムについて
予告時間前になったら出力をするように改造すればできるでしょう。white255 さんが書きました:下記のプログラムで設定時間された時間の予告時間前になったら(5秒くらいの出力)をして設定時間まで処理しその後繰り返すには、どのようにすれば出来ますか?
例えばこんな感じで。
long beforetime = 0;
#define LEDA 13
#define LEDB 12 // 予告用出力
unsigned long time; // 設定時間
unsigned long yokoku; // 予告時間
boolean didYokoku = false;
void setup()
{
pinMode(LEDA, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop()
{
time = 15000; // 設定時間
unsigned long yokoku = 5000; // 予告時間
if (millis() - beforetime > time) {
beforetime = millis();
digitalWrite(LEDB, LOW);
didYokoku = false;
if (digitalRead(LEDA) == LOW)
digitalWrite(LEDA, HIGH);
else
digitalWrite(LEDA, LOW);
} else if (!didYokoku && millis() - beforetime > time - yokoku) {
digitalWrite(LEDB, HIGH);
didYokoku = true;
}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: arduinoのプログラムについて
みけCAT さん ありがとうございます。
早速試してみました。
時間前に予告出力させる事ができました。
出力を短めにしたくて、以下のように(unsigned long yokoku2; // 予告鳴動時間)追加変更し”delay”を利用しましたが、
もっと適切な方法はあるのでしょうか?
(動作確認のためにシリアルで出力し確認しています)
早速試してみました。
時間前に予告出力させる事ができました。
出力を短めにしたくて、以下のように(unsigned long yokoku2; // 予告鳴動時間)追加変更し”delay”を利用しましたが、
もっと適切な方法はあるのでしょうか?
(動作確認のためにシリアルで出力し確認しています)
long beforetime = 0;
#define LEDA 13
#define LEDB 12 // 予告用出力
#define BL 10
unsigned long time; // 設定時間
unsigned long yokoku; // 予告時間
unsigned long yokoku2; // 予告鳴動時間
boolean didYokoku = false;
void setup()
{
pinMode(LEDA, OUTPUT);
pinMode(LEDB, OUTPUT);
Serial.begin(9600);
}
void loop()
{
time = 15000; // 設定時間
yokoku2 = 1500; // 設定時間
unsigned long yokoku = 5000; // 予告時間
if (millis() - beforetime > time) {
beforetime = millis();
digitalWrite(LEDB, LOW);
didYokoku = false;
if (digitalRead(LEDA) == LOW)
digitalWrite(LEDA, HIGH);
else
digitalWrite(LEDA, LOW);
Serial.println("BELL ON"); //digitalWrite(BL, HIGH);
delay(yokoku2);
Serial.println("BELL OFF"); //digitalWrite(BL, OFF);
} else if (!didYokoku && millis() - beforetime > time - yokoku) {
digitalWrite(LEDB, HIGH);
Serial.println("BZ ON"); //digitalWrite(BZ, HIGH);
delay(yokoku2);
digitalWrite(LEDB, LOW);
Serial.println("BZ OFF"); //digitalWrite(BZ, OFF);
didYokoku = true;
}
}
Re: arduinoのプログラムについて
IF文について、下記のように記載しているのですが、うまく動作しません。
LEDA,LEDBは同時に出力(点灯)しないように、記載しているつもりですが同時に出力されます
コンパイルエラーが出たのでIFの部分に”[” ”]”を追加して回避したのですが...
前回のdelayの部分はforを使ってみました。
数日間わからないなりに試行錯誤しましたが、解決できません。ご教授をおねがいします。
LEDA,LEDBは同時に出力(点灯)しないように、記載しているつもりですが同時に出力されます
コンパイルエラーが出たのでIFの部分に”[” ”]”を追加して回避したのですが...
前回のdelayの部分はforを使ってみました。
数日間わからないなりに試行錯誤しましたが、解決できません。ご教授をおねがいします。
/*
起動時は自動でBOX時間を開始し時間経過後にINT時間に移行する、この動作を繰り返す。
予告時間にはブザーを設定時間鳴動
各時間終了時にはベルを設定時間鳴動
スイッチにより、時間を選択。
*/
long beforetime = 0;
#define LEDA 12 //BOX LED
#define LEDB 11 //INT LED
#define BUTTONBOX 5 //BOX TIME 120 or 180(秒)
#define BUTTONINT 6 //INT TIME 30 or 60(秒)
#define BUTTONRUSHA 7 //RUSH 15秒前に予告ベルを鳴らす
#define BUTTONRUSHB 8 //RUSH 30秒前に予告ベルを鳴らす
#define BUTTON 2 //START RESET
#define BZ 9 //予告ブザー
#define BL 10 //終了ベル
volatile int state=LOW; // 動作セレクタ LOW=INT Time
unsigned long time; // 設定時間
unsigned long yokoku; // 予告時間
unsigned long yokoku2; // 予告鳴動時間
boolean didYokoku = false;
unsigned long i;
void setup()
{
pinMode(LEDA, OUTPUT); //BOX LED
pinMode(LEDB, OUTPUT); //INT LED
pinMode(BUTTONBOX, INPUT_PULLUP); //BOX TIME 120 or 180(トグルスイッチ
pinMode(BUTTONINT, INPUT_PULLUP); //INT TIME 30 or 60(トグルスイッチ)
pinMode(BUTTONRUSHA,INPUT_PULLUP); //RUSH 15(トグルスイッチ)
pinMode(BUTTONRUSHB,INPUT_PULLUP); //RUSH 30(トグルスイッチ)
pinMode(BUTTON,INPUT_PULLUP); //START RESET(プッシュスイッチ)
pinMode(BZ,OUTPUT); //予告用ブザー
pinMode(BL,OUTPUT); // 終了ベル
attachInterrupt(0,kirikae,FALLING); //プッシュスイッチでのINT,BOX時間設定切り替え
Serial.begin(9600);
time = 18000; // 設定時間 テスト用の仮設定
yokoku2 = 150; // 設定時間
yokoku = 5000; // 予告時間
digitalWrite(LEDA, HIGH);
}
void loop()
{
running() ; // サブルーチンを呼び出す
}
void running()
{
/* TEST
Serial.println("-----");
Serial.println(time);
Serial.println(yokoku);
Serial.println(digitalRead(BUTTONBOX));
Serial.println(digitalRead(BUTTONINT));
Serial.println(digitalRead(BUTTONRUSHA));
Serial.println(digitalRead(BUTTONRUSHB));
Serial.println("-----");
delay (1000);
*/
if (millis() - beforetime > time) {
beforetime = millis();
digitalWrite(BL, LOW);
didYokoku = false;
if (digitalRead(LEDA) == LOW){
digitalWrite(LEDB, LOW);
digitalWrite(LEDA, HIGH);
Serial.println("BELL ON-box");}
else
{digitalWrite(LEDA, LOW);
digitalWrite(LEDB, HIGH);
Serial.println("BELL ON-int");} //digitalWrite(BL, HIGH);
{
for (int i=0; i<yokoku2; i++){
delay(1); //待つ。
}//For 文の終わりの位置。
delay(1); //待つ。
}
//delay(yokoku2);
Serial.println("BELL OFF");
} else if (!didYokoku && millis() - beforetime > time - yokoku) {
digitalWrite(BL, HIGH);
Serial.println("BZ ON");
{
for (int i=0; i<yokoku2; i++){
delay(1);
}
delay(1);
}
digitalWrite(BL, LOW);
Serial.println("BZ OFF"); //digitalWrite(BZ, OFF);
didYokoku = true;
}
}
void kirikae(){
if(state==LOW){
state=HIGH;
if (digitalRead(BUTTONBOX) == HIGH) {
time = 18000; //digitalWrite(13,HIGH) ;
} else {
time = 12000; //digitalWrite(13,LOW) ;
}
if (digitalRead(BUTTONINT) == HIGH) {
yokoku = 3000;//digitalWrite(13,HIGH) ;
} else {
yokoku = 0;// digitalWrite(13,LOW) ;
}
if (digitalRead(BUTTONRUSHA) == HIGH) {
yokoku = 15000;//digitalWrite(13,HIGH) ;
} else {
yokoku = 0;// digitalWrite(13,LOW) ;
}
delay(100);
}
else{
state=LOW;
if (digitalRead(BUTTONBOX) == HIGH) {
time = 60000; //digitalWrite(13,HIGH) ;
} else {
time = 30000; //digitalWrite(13,LOW) ;
}
if (digitalRead(BUTTONINT) == HIGH) {
yokoku = 3000;//digitalWrite(13,HIGH) ;
} else {
yokoku = 0;// digitalWrite(13,LOW) ;
}
if (digitalRead(BUTTONRUSHB) == HIGH) {
yokoku = 1500;//digitalWrite(13,HIGH) ;
} else {
yokoku = 0;// digitalWrite(13,LOW) ;
}
delay(100);
}
Serial.println("切り替えました");
// Serial.println(state);
// Serial.println(yokoku);
// Serial.println(time);
//digitalWrite(LEDA, HIGH);
//digitalWrite(LEDB, HIGH);
//digitalWrite(BZ, HIGH);
//digitalWrite(BL, HIGH);
delay(1000);
}
Re: arduinoのプログラムについて
手元のArduino UNOで動かしてみましたが、再現できませんでした。white255 さんが書きました:LEDA,LEDBは同時に出力(点灯)しないように、記載しているつもりですが同時に出力されます
どのような操作をしたらそうなりましたか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: arduinoのプログラムについて
みけCATさん、動作確認ありがとうございます。みけCAT さんが書きました:手元のArduino UNOで動かしてみましたが、再現できませんでした。white255 さんが書きました:LEDA,LEDBは同時に出力(点灯)しないように、記載しているつもりですが同時に出力されます
どのような操作をしたらそうなりましたか?
正常とのことで、私も再度確認をしました。
調べた所リレーボードが壊れていることが分かりました、LEDAの入力一度があるとそのままONとなっていました。
電圧等の確認をせず、プログラムの不具合だとばかり考えて対処しようとしたところが失敗でした。
申し訳ありませんでした。
まだまだ、考慮しないといけない部分があり、割り込みの部分でチャタリングしてしまいます。
delayをいろいろ入れてみましたが、良い結果は得られません。
うまく切り替わらないです。
どのようにすれば良いでしょうか?
”attachInterrupt(0,kirikae,FALLING); //プッシュスイッチでのINT,BOX時間設定切り替え”
本来ならば、スイッチを押した時に時間をリセットして切り替えをしたいのですが、現状は
設定時間だけ変えています。
ご教授をおねがいします。