valve measurement board
Dependencies: mbed ads1115_test SDFileSystem
main.cpp
- Committer:
- Yamasaki Taro
- Date:
- 2021-03-09
- Branch:
- UplinkEnabled
- Revision:
- 49:171de000bae0
- Parent:
- 48:70d45f006192
- Child:
- 50:c9f29b839c32
File content as of revision 49:171de000bae0:
#include "mbed.h" #include "SDFileSystem.h" #include "Adafruit_ADS1015.h" #define ADS1115_ADDR 0b1001000 #define TEMP_LSB 0.0625f Serial pc(USBTX, USBRX, 115200); Serial wireless(p28,p27); I2C i2c(p9, p10); Adafruit_ADS1115 ads1115(&i2c, ADS1115_ADDR); SDFileSystem sd(p5, p6, p7, p8, "sd"); SPI TempK(p5, p6, p7); const int Threshold = 114514;//この値は適当。よく考えて決めること!! DigitalInOut valve_controler1(p18, PIN_OUTPUT, OpenDrain, 0); DigitalInOut valve_controler2(p19, PIN_OUTPUT, OpenDrain, 0); DigitalOut led1(LED1); DigitalOut ss1(p19); DigitalOut ss2(p20); Timer timer; Timer sd_timer; FILE *fp; char file_name[64]; int press_bit1, press_bit2; float temp1, temp2; bool ConfigFlag = false; // for debug bool APLFlug = true; // for valve controler void ValveOC(); // Wireless interruption(fake) for open/close valve int main() { timer.start(); wireless.baud(115200); uint16_t data[2]; ads1115.setGain(GAIN_TWOTHIRDS); TempK.format(16, 0); TempK.frequency(5000000); char file_name_format[] = "/sd/IZU2020_VALVE_MEASUREMENT_%d.dat"; int file_number = 1; while(1) { sprintf(file_name, file_name_format, file_number); fp = fopen(file_name, "r"); if(fp != NULL) { fclose(fp); file_number++; } else { sprintf(file_name, file_name_format, file_number); break; } } fp = fopen(file_name, "w"); sd_timer.start(); int dt = 0; while(1) { press_bit1 = ads1115.readADC_SingleEnded(1); press_bit2 = ads1115.readADC_SingleEnded(3); ss1 = 0; data[0] = TempK.write(0x00); data[1] = TempK.write(0x00); ss1 = 1; data[0] &= 0xfffc; temp1 = (float)((int16_t)data[0]) * TEMP_LSB; ss2 = 0; data[0] = TempK.write(0x00); data[1] = TempK.write(0x00); ss2 = 1; data[0] &= 0xfffc; temp2 = (float)((int16_t)data[0]) * TEMP_LSB; // Debug and Config section----------------------------------------------------------------- if (pc.readable() > 0) { wireless.putc(pc.getc()); if(!ConfigFlag) { ConfigFlag = true; } } if(ConfigFlag) { while (wireless.readable() > 0) { pc.putc(wireless.getc()); } continue; } // ----------------------------------------------------------------------------------------- int time = timer.read_ms(); if(time - dt >= 500) { // Debug and Config section----------------------------------------------------------------- if (pc.readable() == 0 && wireless.readable() == 0) { pc.printf("%d\t%d\t%d\t%f\t%f\r\n", timer.read_ms(), press_bit1, press_bit2, temp1, temp2); } // ----------------------------------------------------------------------------------------- wireless.printf("Tank Pressure is %d now.\r\n", press_bit1); dt = time; } //valvcontroler auto pressure limitation---------------------------------------------------- if(wireless.readable() > 0) { // This support only single lettar. char up_msg = wireless.getc(); wireless.printf("Message = %c.",up_msg); if (up_msg == 'o') //open { valve_controler1 = 1; valve_controler2 = 1; APLFlug = false; wireless.printf("Valve Opened.\r\n"); } else if (up_msg == 'c') //close { valve_controler1 = 0; valve_controler2 = 0; APLFlug = false; wireless.printf("Valve Closed.\r\n"); } else { if (// These must be just responses. ← とも言い切れなくなった。なにもしてなかったのにprintfされたり、間違ったコマンドを送信したのに反応が無かったりした。 up_msg != 'O' && up_msg != 'K' && up_msg != 'N' && up_msg != 'G' && up_msg != ' ' && up_msg != '0' && up_msg != '1' && up_msg != '2' && up_msg != '3' && up_msg != '4' && up_msg != '5' && up_msg != '6' && up_msg != '7' && up_msg != '8' && up_msg != '9' ){ wireless.printf("You send invaild command.\r\n"); } } } if(APLFlug) { if(press_bit1 > Threshold) { valve_controler1 = 1; valve_controler2 = 1; } else{ valve_controler1 = 0; valve_controler2 = 0; } } else if(!APLFlug) { wireless.printf("Auto Pressure Limitation is Disabled.\r\n"); } //------------------------------------------------------------------------------------------ fprintf(fp, "%d\t%d\t%d\t%f\t%f\r\n", time, press_bit1, press_bit2, temp1, temp2); if(sd_timer.read_ms() > 20*1000) { if(fp) { fclose(fp); fp = fopen(file_name, "a"); } } } } // If you feel this ugly, please refactor THIS !!.