Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:b3dbca741ae4, committed 2015-04-11
- Comitter:
- frisk
- Date:
- Sat Apr 11 01:57:01 2015 +0000
- Commit message:
- Scale speed mater
Changed in this revision
diff -r 000000000000 -r b3dbca741ae4 TextLCD.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Sat Apr 11 01:57:01 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
diff -r 000000000000 -r b3dbca741ae4 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Apr 11 01:57:01 2015 +0000 @@ -0,0 +1,333 @@ +//************************************************************************************************* +// +// スケールスピードメータプログラム +// +// Projyect name : ScaleSpeed +// Date : 2015.04.08 +// Target : FRDM-KL25Z +// +// 仕様 +// Start swich : 計測開始ボタン +// Break switch : 計測中止ボタン +// Distance switch : 計測距離設定ボタン +// Scale switch : 縮尺切替ボタン +// +// Start : LED on green +// Senser1 : LED on Yelow +// Senser2 : LED on Blue +// +//************************************************************************************************* +#include "mbed.h" +#include "TextLCD.h" +#define ON 0 +#define OFF 1 +Serial pc(USBTX, USBRX); // USB COMポート設定 +TextLCD lcd(A0, A1, A2, A3, A4, A5); // TextLCD設定 +Timer timer; // タイマー計測初期化 +InterruptIn int1(D12); // 割込みピン設定(センサー1) +InterruptIn int2(D11); // 割込みピン設定(センサー2) + +/* 三色LEDポート設定 */ +DigitalOut greenLed(LED_GREEN); // 緑 +DigitalOut redLed(LED_RED); // 赤 +DigitalOut blueLed(LED_BLUE); // 青 + + +/* スイッチポート設定 */ +DigitalIn startSW(D2); +DigitalIn breakSW(D3); +DigitalIn distanceSW(D4); +DigitalIn scaleSW(D5); +DigitalIn sence1(D12); +DigitalIn sence2(D11); + +/* グローバル定義 */ +bool countFlag; // 計測中フラッグ +bool endFlag; // 計測完了フラッグ +bool changeFlag; // 変化フラッグ + +uint8_t charCounter; // 割込み文字カウンタ + +//******************************************************* +// Serial受信割り込みベクタ関数(キーボード割込み) +//******************************************************* +void pcRx(){ + char c; + c = pc.getc(); + if (c == 0xa0) charCounter = 0; + else{ + lcd.locate(charCounter,1); + lcd.putc(c); + charCounter++; + if (charCounter > 10) charCounter = 0; + } +} + +//******************************************************* +// センサー1割込み関数 +//******************************************************* +void senser1(){ + if (countFlag){ + timer.start(); + redLed = 0; + } +} + +//******************************************************* +// センサー2割込み関数 +//******************************************************* +void senser2(){ + if (countFlag){ + timer.stop(); + redLed = 1; + countFlag = 0; + endFlag = 1; + changeFlag = 1; + } +} + +//******************************************************* +// Distance設定関数 +//******************************************************* +uint32_t distanceConfig(int counter){ + + /* Print distance */ + lcd.locate(2,0); + switch(counter){ + case 0: + lcd.printf("10mm"); + return 10000; + case 1: + lcd.printf("50mm"); + return 50000; + case 2: + lcd.printf("10cm"); + return 100000; + case 3: + lcd.printf("50cm"); + return 500000; + case 4: + lcd.printf("1.0m"); + return 1000000; + case 5: + lcd.printf("5.0m"); + return 5000000; + default: + return 0; + } +} + +//******************************************************* +// LCD表示関数 +//******************************************************* +uint16_t scaleConfig(int counter){ + + /* Print scale */ + lcd.locate(11,0); + switch(counter){ + case 0: + lcd.printf("1/150"); + return 150; + case 1: + lcd.printf("1/120"); + return 120; + case 2: + lcd.printf("1/100"); + return 100; + case 3: + lcd.printf("1/87 "); + return 87; + case 4: + lcd.printf("1/76 "); + return 76; + case 5: + lcd.printf("1/48 "); + return 48; + case 6: + lcd.printf("1/35 "); + return 35; + case 7: + lcd.printf("1/30 "); + return 30; + case 8: + lcd.printf("1/24 "); + return 24; + case 9: + lcd.printf("1/20 "); + return 20; + case 10: + lcd.printf("1/16 "); + return 16; + case 11: + lcd.printf("1/12 "); + return 12; + case 12: + lcd.printf("1/10 "); + return 10; + case 13: + lcd.printf("1/8 "); + return 8; + case 14: + lcd.printf("1/6 "); + return 6; + case 15: + lcd.printf("1/4 "); + return 4; + case 16: + lcd.printf("1/2 "); + return 2; + case 17: + lcd.printf("1/1 "); + return 1; + default: + return 0; + } +} + +//******************************************************* +// メイン関数 +//******************************************************* +int main() { + bool startFlag = 0; + bool breakFlag = 0; + bool distanceFlag = 0; + bool scaleFlag = 0; + + uint8_t scaleCounter = 0; // 縮尺設定番号 + uint8_t distanceCounter = 0; // 計測距離設定番号 + + uint32_t distance = 0; // 距離(mm) + uint16_t scale = 0; // 縮尺比 + uint32_t speedSec; // 秒速値 + uint32_t speedScale; // 縮尺変換秒速値 + uint16_t speed; // 速度データ(km/h) + + redLed = 1; + greenLed = 1; + blueLed = 1; + + /* Print start */ + wait(0.5); + lcd.printf(" FRDM-KL25Z"); + wait(0.5); + pc.printf("Start!\r\n"); + charCounter = 0; + wait(1); + + /* Print LCD fixed charactor */ + lcd.cls(); + lcd.locate(0,0); + lcd.printf("D="); + lcd.locate(7,0); + lcd.printf("SCL="); + lcd.locate(12,1); + lcd.printf("km/h"); + lcd.locate(0,1); + lcd.printf("1: 2:"); + changeFlag = 1; + + /* Enable interrupt */ + int1.fall(&senser1); + int2.fall(&senser2); + +//******************************************************* +// メインループ +//******************************************************* + while(1) { + + /* Recieve serial */ + pc.attach(pcRx,Serial::RxIrq); + + /* Push start switch */ + if(!startSW && !startFlag){ + wait_ms(10); // チャタリング防止 + if (!startSW){ + changeFlag = 1; + startFlag = 1; + endFlag = 0; + breakFlag = 0; + countFlag = 1; + timer.reset(); + } + } + else if (startFlag) startFlag = 0; + + /* Push break switch */ + if(!breakSW && !breakFlag){ + wait_ms(10); + if (!breakSW){ + changeFlag = 1; + breakFlag = 1; + countFlag = 0; + timer.stop(); + speed = 0; + redLed = 1; + } + } + else if (breakSW) breakFlag = 0; + + /* Push scale switch */ + if(!scaleSW && !scaleFlag){ + wait_ms(10); + if (!scaleSW){ + changeFlag = 1; + scaleFlag = 1; + scaleCounter++; + if (scaleCounter > 17) scaleCounter = 0; + } + } + else if (scaleSW) scaleFlag = 0; + + /* Push distance switch */ + if(!distanceSW && !distanceFlag){ + wait_ms(10); + if (!distanceSW){ + changeFlag = 1; + distanceFlag = 1; + distanceCounter++; + if (distanceCounter > 5) distanceCounter = 0; + } + } + else if (distanceSW) distanceFlag = 0; + + /* sence1 */ + lcd.locate(2,1); + if (sence1) lcd.printf("H"); + else lcd.printf("L"); + + /* sence2 */ + lcd.locate(6,1); + if (sence2) lcd.printf("H"); + else lcd.printf("L"); + + /* Set LED */ + if (countFlag) greenLed =0; + else greenLed = 1; + + if (endFlag) blueLed = 0; + else blueLed = 1; + + /* 速度計算と表示 */ + if (changeFlag){ + changeFlag = 0; + + /* 距離設定 */ + distance = distanceConfig(distanceCounter); + + /* 縮尺設定 */ + scale = scaleConfig(scaleCounter); + + /* 速度計算 */ + speedSec = distance / timer.read_ms(); // 速度(mm/sec) = 距離 / 時間 + speedScale = speedSec * scale; // 縮尺速度 = 秒速 × 縮尺 + speed = (speedScale * 36) / 10000; // 時速km/h = 縮尺速度 × 3600sec(1h) / 1000000 + + /* 速度表示 */ + lcd.locate(8,1); + if (speed < 10000) lcd.printf("%4d",speed); + else lcd.printf("----"); + pc.printf("%d",speed); // For debug + } + } +} +/* End of main */ \ No newline at end of file
diff -r 000000000000 -r b3dbca741ae4 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Apr 11 01:57:01 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/e188a91d3eaa \ No newline at end of file