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.
Dependencies: mbed SDFileSystem ds3231 AQM1602
Revision 0:9aa1fc6fba40, committed 2020-03-23
- Comitter:
- mbedfujimura
- Date:
- Mon Mar 23 11:53:38 2020 +0000
- Commit message:
- SD & LCD
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AQM1602.lib Mon Mar 23 11:53:38 2020 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/AkinoriHashimoto/code/AQM1602/#43f874a2b8e9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Mon Mar 23 11:53:38 2020 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/neilt6/code/SDFileSystem/#e4d2567200db
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ds3231.lib Mon Mar 23 11:53:38 2020 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/teams/Maxim-Integrated/code/ds3231/#11630748e2f2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Mar 23 11:53:38 2020 +0000
@@ -0,0 +1,565 @@
+#include "mbed.h"
+#include "AQM1602.h"
+#include "SDFileSystem.h"
+#include "ds3231.h"
+#define ESC 0x1B
+
+//-------LCD Setting------
+I2C i2c(PB_7, PB_6);//sda,scl
+AQM1602 lcd(i2c);
+
+//-------SD Setting-------
+SDFileSystem sd(PE_6, PE_5, PE_2, PE_3 , "sd");//mosi.miso,sck,cs,mount
+
+//------AE Data(SPI)------
+SPI spi(PF_9, PF_8, PF_7); // mosi, miso, sclk
+DigitalOut IO_CS(PF_13);
+
+//-----------RTC----------
+void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member);
+void get_user_input(char* message, uint8_t min, uint8_t max, bool* member);
+
+//--------IO Enable--------
+DigitalOut IO_Enable(PD_9);
+
+//-----AE Interrupt--------
+InterruptIn DE(PG_8);//IO10 Analog Bord IO9
+
+//---------------------------------
+// HPF Setting
+// 0:THRU 1:30kHz 2:100kHz 3:200kHz
+//---------------------------------
+BusInOut IO_HPF(PD_10,PD_14);
+
+//---------------------------------
+// Gain Setting
+// 0:0dB 1:10dB 2:20dB 3:30dB 4:40dB
+//---------------------------------
+BusInOut IO_Gain(PD_15,PE_14,PE_15,PG_2);//IO1,IO2,IO3 Analog Bord IO0,IO1,IO2,IO3
+
+//-----I/O Setting--------
+DigitalOut IO5(PG_3);//Analog Bord IO4
+DigitalOut IO6(PG_4);//Analog Bord IO5
+DigitalOut IO7(PG_5);//Analog Bord IO6
+DigitalOut IO8(PG_6);//Analog Bord IO7
+DigitalOut IO9(PG_7);//Analog Bord IO8
+
+//-----------Alarm---------
+DigitalOut Ararm(PF_14);
+//---------Encoder---------
+DigitalIn Encorder_SW(PA_15); //SW
+//DigitalIn Encorder_A(PD_0); //A
+DigitalIn Encorder_B(PD_1); //B
+InterruptIn Encorder_A(PD_0); //A
+
+
+//-----Serial Setting------
+Serial rs232 (PB_10, PB_11);
+
+uint16_t WaveData1[32768];
+uint16_t WaveData2[32768];
+int DataEnable;
+int EncAEnable;
+int EncCount;
+
+//------AE Interrupt Main------
+void GetData(){
+ DataEnable=1;
+}
+
+//-------Encoder Interrupt------
+void EncCheck(){
+ EncAEnable=1;
+ //wait_ms(2);
+}
+
+void menu1(){
+ switch(EncCount){
+ case(1):
+ lcd.locate(0,0);lcd.printf(" 1.Mode ");
+ break;
+ case(2):
+ lcd.locate(0,0);lcd.printf(" 2.Gain ");
+ break;
+ case(3):
+ lcd.locate(0,0);lcd.printf(" 3.HPF ");
+ break;
+ case(4):
+ lcd.locate(0,0);lcd.printf(" 4.Interval ");
+ break;
+ case(5):
+ lcd.locate(0,0);lcd.printf(" 5.EXIT ");
+ break;
+ }
+}
+
+void menu2(){
+ switch(EncCount){
+ case(1):
+ lcd.locate(0,0);lcd.printf(" Gain=0dB ");
+ break;
+ case(2):
+ lcd.locate(0,0);lcd.printf(" Gain=10dB ");
+ break;
+ case(3):
+ lcd.locate(0,0);lcd.printf(" Gain=20dB ");
+ break;
+ case(4):
+ lcd.locate(0,0);lcd.printf(" Gain=30dB ");
+ break;
+ case(5):
+ lcd.locate(0,0);lcd.printf(" Gain=40dB ");
+ break;
+ case(6):
+ lcd.locate(0,0);lcd.printf(" EXIT ");
+ break;
+ }
+}
+
+int main()
+{
+ //------Serial Setting------
+ rs232.baud(230400);
+ //---------Init LCD---------
+ lcd.init();
+ //---Mount the filesystem---
+ sd.mount();
+ //--------IO Power ON-------
+ wait_ms(100);
+ IO_Enable=1;
+ //------Initial Display-----
+ lcd.clear();
+ lcd.setDispFlag(1,0,0); //Cursole消す
+ //-------SPI Setting-------
+ IO_CS = 1;
+ spi.format(16,0);
+ spi.frequency(1000000);
+
+ //-----------------------------SD test------------------------------
+ lcd.clear();
+ lcd.locate(0,0);
+ lcd.printf("WR to SD card ");
+ wait_ms(100);
+
+ //----------SD書き込み試験--------
+ FILE *fp = fopen("/sd/sdtest.txt", "w"); // 追加書き込み
+
+ if (fp != NULL)
+ {
+ fprintf(fp, "SD カードのテストファイルです.\r\n");
+ fclose(fp);
+
+ lcd.locate(0,0);
+ lcd.printf(" SDWR SUCCESS! ");
+ wait_ms(100);
+ }
+ else{
+ lcd.clear();
+ lcd.locate(0,0);
+ lcd.printf(" SD FAILED! ");
+ while(1);
+ }
+
+ //----------SD読み出し試験--------
+ lcd.locate(0,0);
+ lcd.printf("Reading from SD ");
+ fp = fopen("/sd/sdtest.txt", "r");
+ if (fp != NULL)
+ {
+ char str[256];
+ while (fgets(str, 256, fp) != NULL)
+ //rs232.printf("%s", str);
+ fclose(fp);
+ lcd.locate(0,0);
+ lcd.printf(" SDRD SUCCESS! ");
+ wait_ms(100);
+ }
+ else{
+ lcd.clear();
+ lcd.locate(0,0);
+ lcd.printf(" SD FAILED! ");
+ while(1);
+ }
+
+ //--------チェック結果の表示--------
+ lcd.locate(0,0);
+ lcd.printf(" CHECK All OK! ");
+ wait(1);
+ lcd.locate(0,0);
+ lcd.printf(" FUJIMURA CREST");
+ lcd.locate(0,1);
+ lcd.printf(" FCAS-M101 ");
+ wait(1);
+
+ //-----------------------------RTCセッティング------------------------------
+ //Ds3231 rtc(PB_7, PB_6);
+ Ds3231 rtc(PF_0, PF_1);
+ time_t epoch_time;
+
+ //default, use bit masks in ds3231.h for desired operation
+ ds3231_cntl_stat_t rtc_control_status = {0,0};
+ ds3231_time_t rtc_time;
+ ds3231_calendar_t rtc_calendar;
+
+//******************************* メインルーチン *******************************
+ uint16_t spi_data[16];
+ uint16_t Amplitude;
+ char TxDataChar1,TxDataChar2;
+ char moji[36];
+ uint32_t n,i;
+ int Gain; //Gain
+ int StartFlag=1;
+ int menuFlag =1;
+ int EncCount2;
+
+ //---------BUS(ゲイン)の設定-----------
+ IO_Gain.output();
+ IO_Gain=2;
+
+ //---------------HPF 30kHz------------
+ IO_HPF.output();
+ IO_HPF=0;
+
+ //---------------割り込みON------------
+ DE.rise(&GetData);
+ Encorder_A.rise(&EncCheck);
+
+
+
+
+ while(1) {
+ //----------------------------------------------------------------
+ while(StartFlag){
+ lcd.locate(0,0);
+ lcd.printf(" Wait START! ");
+ lcd.locate(0,1);
+ lcd.printf(" Menu>Push long");
+
+ if(Encorder_SW==0){
+ wait_ms(300);
+ StartFlag=0;
+ //----------menu選択--------
+ if(Encorder_SW==0){
+ StartFlag=1;
+ lcd.clear();
+ lcd.locate(0,0);
+ lcd.printf(" -----Menu----- ");
+ wait_ms(500);
+
+ //---------------------Select menu-----------------
+ while(menuFlag){
+ //----------Encoder Check--------
+ if(EncAEnable==1){
+ wait_us(100);
+ if(Encorder_B==0){
+ EncCount=EncCount+1;
+ }else{
+ if(EncCount!=0){
+ EncCount=EncCount-1;
+ }
+ }
+ menu1();
+ EncAEnable=0;
+ }
+ if(EncCount>5){
+ EncCount=5;
+ }
+ //----------Encoder End--------
+
+ if(Encorder_SW==0){
+ if(EncCount==2){
+ lcd.locate(0,0);
+ lcd.printf(" Select Gain ");
+ EncCount=1;
+ while(1){
+ //----------Encoder Check--------
+ if(EncAEnable==1){
+ wait_us(100);
+ if(Encorder_B==0){
+ EncCount=EncCount+1;
+ if(EncCount>6){
+ EncCount=6;
+ }
+ }else{
+ if(EncCount!=0){
+ EncCount=EncCount-1;
+ }
+ }
+ menu2();
+ EncAEnable=0;
+ }
+ //----------Encoder End--------
+ if(Encorder_SW==0){
+ if(EncCount!=6){
+ switch(EncCount){
+ case(1):
+ IO_Gain=0;
+ lcd.locate(0,0);lcd.printf(" Set Gain=0dB ");
+ break;
+ case(2):
+ IO_Gain=1;
+ lcd.locate(0,0);lcd.printf(" Set Gain=10dB ");
+ break;
+ case(3):
+ IO_Gain=2;
+ lcd.locate(0,0);lcd.printf(" Set Gain=20dB ");
+ break;
+ case(4):
+ IO_Gain=3;
+ lcd.locate(0,0);lcd.printf(" Set Gain=30dB ");
+ break;
+ case(5):
+ IO_Gain=4;
+ lcd.locate(0,0);lcd.printf(" Set Gain=40dB ");
+ break;
+ }
+ }
+ if(EncCount==6){ //menu終了
+ menuFlag=0;
+ StartFlag=1;
+ wait_ms(50);
+ break;
+ }
+ }
+ }
+ }
+
+ if(EncCount==5){ //menu終了
+ menuFlag=0;
+ StartFlag=1;
+ wait_ms(50);
+ }
+ }
+ }
+ //-----------------Select menu End------------------
+ }
+ menuFlag=1;
+ EncCount=0;
+ }
+ }
+ //----------------------------------------------------------------
+
+
+ if(n==0){
+ //----------データ保存SDオープン--------
+ //new epoch time fx
+ epoch_time = rtc.get_epoch();
+ strftime(moji, 32, "/sd/%m%d_%I%M%S.csv", localtime(&epoch_time));
+ fp = fopen(moji, "a+"); // 追加書き込み
+ }
+
+ if(DataEnable==1){
+ IO_CS=0;
+ spi_data[0] = spi.write(Gain);
+ IO_CS=1;
+
+ TxDataChar1=(spi_data[0] & 0x007f); //0-6
+ TxDataChar2=(spi_data[0] & 0xff80)>>7; //7-12
+ //SDカードへ包絡線検波波形データ書き込み
+ Amplitude=TxDataChar2*128+TxDataChar1;
+
+ if(n==0){
+ lcd.clear();
+ lcd.locate(0,0);
+ lcd.printf(" ----START----");
+ }
+
+ if(n<4096){
+ WaveData1[n]=Amplitude;
+ }
+
+ DataEnable=0;
+ n=n+1;
+ }
+
+ if(n==4096){
+ //new epoch time fx
+ epoch_time = rtc.get_epoch();
+
+ strftime(moji, 32, "%m/%d %I:%M:%S \r\n", localtime(&epoch_time));
+ fprintf(fp, moji);
+
+ lcd.locate(0,0);
+ lcd.printf(" --Save Data-- ");
+
+ while(i<4096){
+ if (fp != NULL){
+ sprintf(moji,"%d\r\n",WaveData1[i]);
+ fprintf(fp, moji);
+ }else{
+ lcd.clear();
+ lcd.locate(0,0);
+ lcd.printf(" SD FAILED! ");
+ while(1);
+ }
+ i=i+1;
+ }
+ fclose(fp);
+ lcd.locate(0,0);
+ lcd.printf("Data Save END!");
+ wait_ms(500);
+ n=0;
+ i=0;
+ StartFlag=1;
+ }
+
+
+ }
+
+
+
+/*
+ rtc.set_cntl_stat_reg(rtc_control_status);
+
+ //get day from user
+ get_user_input("\n\rPlease enter day of week, 1 for Sunday (1-7): ", 1,
+ 7, &rtc_calendar.day);
+
+ //get day of month from user
+ get_user_input("\n\rPlease enter day of month (1-31): ", 1, 31,
+ &rtc_calendar.date);
+
+ //get month from user
+ get_user_input("\n\rPlease enter the month, 1 for January (1-12): ", 1,
+ 12, &rtc_calendar.month);
+
+ //get year from user
+ get_user_input("\n\rPlease enter the year (0-99): ",0, 99,
+ &rtc_calendar.year);
+
+ //Get time mode
+ get_user_input("\n\rWhat time mode? 1 for 12hr 0 for 24hr: ", 0, 1,
+ &rtc_time.mode);
+
+ if(rtc_time.mode)
+ {
+ //Get AM/PM status
+ get_user_input("\n\rIs it AM or PM? 0 for AM 1 for PM: ", 0, 1,
+ &rtc_time.am_pm);
+ //Get hour from user
+ get_user_input("\n\rPlease enter the hour (1-12): ", 1, 12,
+ &rtc_time.hours);
+ }
+ else
+ {
+ //Get hour from user
+ get_user_input("\n\rPlease enter the hour (0-23): ", 0, 23,
+ &rtc_time.hours);
+ }
+
+ //Get minutes from user
+ get_user_input("\n\rPlease enter the minute (0-59): ", 0, 59,
+ &rtc_time.minutes);
+
+
+ //Get seconds from user
+ get_user_input("\n\rPlease enter the second (0-59): ", 0, 59,
+ &rtc_time.seconds);
+
+
+
+ //Set the time, uses inverted logic for return value
+ if(rtc.set_time(rtc_time))
+ {
+ printf("\n\rrtc.set_time failed!!\n\r");
+ exit(0);
+ }
+
+
+
+ //Set the calendar, uses inverted logic for return value
+ if(rtc.set_calendar(rtc_calendar))
+ {
+ rs232.printf("\n\rrtc.set_calendar failed!!\n\r");
+ exit(0);
+ }
+*/
+ char buffer[32];
+
+
+ while(1){
+
+ rs232.printf("%c[2J", ESC); //clear screen
+ rs232.printf("%c[H", ESC); //move cursor to Home
+
+ //new epoch time fx
+ epoch_time = rtc.get_epoch();
+
+
+ //lcd.printf("\n\r%s", ctime(&epoch_time));
+ rs232.printf("\n\r%s", ctime(&epoch_time));
+
+ //strftime(buffer, 32, "%I:%M %p\n\r", localtime(&epoch_time));
+
+ strftime(buffer, 32, "%m/%d %I:%M:%S", localtime(&epoch_time));
+ lcd.locate(0,1);
+ lcd.printf("%s", buffer);
+ //rs232.printf("%s", buffer);
+
+ wait(1);
+ } //loop
+
+
+
+}
+
+
+
+/**********************************************************************
+* Function: get_user_input()
+* Parameters: message - user prompt
+* min - minimum value of input
+* max - maximum value of input
+* member - pointer to struct member
+* Returns: none
+*
+* Description: get time/date input from user
+*
+**********************************************************************/
+void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member)
+{
+ uint32_t temp;
+
+ do
+ {
+ rs232.printf("\n\r%s", message);
+
+ //for some reason mbed doesn't like a pointer to a member in scanf
+ //term.scanf("%d", member); works with gcc on RPi
+ rs232.scanf("%d", &temp);
+
+ *member = temp;
+
+ if((*(member)< min) || (*(member) > max))
+ {
+ rs232.printf("\n\rERROR-RTI");
+ }
+ }
+ while((*(member) < min) || (*(member) > max));
+}
+
+
+void get_user_input(char* message, uint8_t min, uint8_t max, bool* member)
+{
+ uint32_t temp;
+
+ do
+ {
+ rs232.printf("\n\r%s", message);
+
+ //for some reason mbed doesn't like a pointer to a member in scanf
+ //term.scanf("%d", member); works with gcc on RPi
+ rs232.scanf("%d", &temp);
+
+ *member = temp;
+
+ if((*(member)< min) || (*(member) > max))
+ {
+ rs232.printf("\n\rERROR-RTI");
+ }
+ }
+ while((*(member) < min) || (*(member) > max));
+}
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Mar 23 11:53:38 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/2241e3a39974 \ No newline at end of file