SD
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
diff -r 000000000000 -r 9aa1fc6fba40 AQM1602.lib --- /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
diff -r 000000000000 -r 9aa1fc6fba40 SDFileSystem.lib --- /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
diff -r 000000000000 -r 9aa1fc6fba40 ds3231.lib --- /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
diff -r 000000000000 -r 9aa1fc6fba40 main.cpp --- /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)); +} + + +
diff -r 000000000000 -r 9aa1fc6fba40 mbed.bld --- /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