valve measurement board

Dependencies:   mbed ads1115_test SDFileSystem

Committer:
Yamasaki Taro
Date:
Tue Mar 09 17:48:53 2021 +0900
Branch:
UplinkEnabled
Revision:
50:c9f29b839c32
Parent:
49:171de000bae0
Child:
51:61f7e3e5f9b5
Improve Uplink and Downlink

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tanahashi 0:cb9da8306a40 1 #include "mbed.h"
Yamasaki Taro 1:655abe8ab309 2
tanahashi 0:cb9da8306a40 3 #include "SDFileSystem.h"
tanahashi 0:cb9da8306a40 4
tanahashi 0:cb9da8306a40 5 #include "Adafruit_ADS1015.h"
tanahashi 0:cb9da8306a40 6
tanahashi 0:cb9da8306a40 7 #define ADS1115_ADDR 0b1001000
tanahashi 0:cb9da8306a40 8
tanahashi 0:cb9da8306a40 9 #define TEMP_LSB 0.0625f
tanahashi 0:cb9da8306a40 10
Yamasaki Taro 10:de2a9468b344 11 Serial pc(USBTX, USBRX, 115200);
Yamasaki Taro 34:8162968f404f 12
Yamasaki Taro 2:824e174ef9ea 13 Serial wireless(p28,p27);
tanahashi 0:cb9da8306a40 14
tanahashi 0:cb9da8306a40 15 I2C i2c(p9, p10);
tanahashi 0:cb9da8306a40 16
tanahashi 0:cb9da8306a40 17 Adafruit_ADS1115 ads1115(&i2c, ADS1115_ADDR);
tanahashi 0:cb9da8306a40 18
tanahashi 0:cb9da8306a40 19 SDFileSystem sd(p5, p6, p7, p8, "sd");
tanahashi 0:cb9da8306a40 20
tanahashi 0:cb9da8306a40 21 SPI TempK(p5, p6, p7);
tanahashi 0:cb9da8306a40 22
Yamasaki Taro 12:8a4212e2642a 23 const int Threshold = 114514;//この値は適当。よく考えて決めること!!
Yamasaki Taro 12:8a4212e2642a 24
Yamasaki Taro 30:cf909d4c6710 25 DigitalInOut valve_controler1(p18, PIN_OUTPUT, OpenDrain, 0);
Yamasaki Taro 30:cf909d4c6710 26 DigitalInOut valve_controler2(p19, PIN_OUTPUT, OpenDrain, 0);
Yamasaki Taro 12:8a4212e2642a 27
Yamasaki Taro 50:c9f29b839c32 28 bool IsValveOpened = false;
Yamasaki Taro 50:c9f29b839c32 29
tanahashi 0:cb9da8306a40 30 DigitalOut led1(LED1);
tanahashi 0:cb9da8306a40 31
tanahashi 0:cb9da8306a40 32 DigitalOut ss1(p19);
tanahashi 0:cb9da8306a40 33 DigitalOut ss2(p20);
tanahashi 0:cb9da8306a40 34
tanahashi 0:cb9da8306a40 35 Timer timer;
tanahashi 0:cb9da8306a40 36 Timer sd_timer;
tanahashi 0:cb9da8306a40 37
tanahashi 0:cb9da8306a40 38 FILE *fp;
tanahashi 0:cb9da8306a40 39
tanahashi 0:cb9da8306a40 40 char file_name[64];
tanahashi 0:cb9da8306a40 41
tanahashi 0:cb9da8306a40 42 int press_bit1, press_bit2;
tanahashi 0:cb9da8306a40 43 float temp1, temp2;
tanahashi 0:cb9da8306a40 44
Yamasaki Taro 17:528afcef65e8 45 bool ConfigFlag = false; // for debug
Yamasaki Taro 17:528afcef65e8 46
Yamasaki Taro 35:c6457c5ce996 47 bool APLFlug = true; // for valve controler
Yamasaki Taro 35:c6457c5ce996 48
Yamasaki Taro 50:c9f29b839c32 49 void ValveOpen()
Yamasaki Taro 50:c9f29b839c32 50 {
Yamasaki Taro 50:c9f29b839c32 51 valve_controler1 = 1;
Yamasaki Taro 50:c9f29b839c32 52 valve_controler2 = 1;
Yamasaki Taro 50:c9f29b839c32 53 IsValveOpened = true;
Yamasaki Taro 50:c9f29b839c32 54 }
Yamasaki Taro 50:c9f29b839c32 55
Yamasaki Taro 50:c9f29b839c32 56 void ValveClose()
Yamasaki Taro 50:c9f29b839c32 57 {
Yamasaki Taro 50:c9f29b839c32 58 valve_controler1 = 0;
Yamasaki Taro 50:c9f29b839c32 59 valve_controler2 = 0;
Yamasaki Taro 50:c9f29b839c32 60 IsValveOpened = false;
Yamasaki Taro 50:c9f29b839c32 61 }
Yamasaki Taro 36:a2eadc00dbf8 62
tanahashi 0:cb9da8306a40 63 int main()
tanahashi 0:cb9da8306a40 64 {
Yamasaki Taro 25:389d96280bcf 65 timer.start();
Yamasaki Taro 25:389d96280bcf 66 wireless.baud(115200);
Yamasaki Taro 1:655abe8ab309 67
Yamasaki Taro 25:389d96280bcf 68 uint16_t data[2];
Yamasaki Taro 25:389d96280bcf 69 ads1115.setGain(GAIN_TWOTHIRDS);
Yamasaki Taro 25:389d96280bcf 70 TempK.format(16, 0);
Yamasaki Taro 25:389d96280bcf 71 TempK.frequency(5000000);
tanahashi 0:cb9da8306a40 72
Yamasaki Taro 25:389d96280bcf 73 char file_name_format[] = "/sd/IZU2020_VALVE_MEASUREMENT_%d.dat";
Yamasaki Taro 25:389d96280bcf 74 int file_number = 1;
Yamasaki Taro 25:389d96280bcf 75 while(1) {
Yamasaki Taro 25:389d96280bcf 76 sprintf(file_name, file_name_format, file_number);
Yamasaki Taro 25:389d96280bcf 77 fp = fopen(file_name, "r");
Yamasaki Taro 25:389d96280bcf 78 if(fp != NULL) {
Yamasaki Taro 25:389d96280bcf 79 fclose(fp);
Yamasaki Taro 25:389d96280bcf 80 file_number++;
Yamasaki Taro 25:389d96280bcf 81 } else {
Yamasaki Taro 25:389d96280bcf 82 sprintf(file_name, file_name_format, file_number);
Yamasaki Taro 25:389d96280bcf 83 break;
Yamasaki Taro 25:389d96280bcf 84 }
Yamasaki Taro 25:389d96280bcf 85 }
Yamasaki Taro 25:389d96280bcf 86 fp = fopen(file_name, "w");
Yamasaki Taro 25:389d96280bcf 87 sd_timer.start();
tanahashi 0:cb9da8306a40 88
Yamasaki Taro 25:389d96280bcf 89 int dt = 0;
Yamasaki Taro 25:389d96280bcf 90 while(1) {
tanahashi 0:cb9da8306a40 91
Yamasaki Taro 25:389d96280bcf 92 press_bit1 = ads1115.readADC_SingleEnded(1);
Yamasaki Taro 25:389d96280bcf 93 press_bit2 = ads1115.readADC_SingleEnded(3);
tanahashi 0:cb9da8306a40 94
Yamasaki Taro 25:389d96280bcf 95 ss1 = 0;
Yamasaki Taro 25:389d96280bcf 96 data[0] = TempK.write(0x00);
Yamasaki Taro 25:389d96280bcf 97 data[1] = TempK.write(0x00);
Yamasaki Taro 25:389d96280bcf 98 ss1 = 1;
Yamasaki Taro 25:389d96280bcf 99 data[0] &= 0xfffc;
Yamasaki Taro 25:389d96280bcf 100 temp1 = (float)((int16_t)data[0]) * TEMP_LSB;
tanahashi 0:cb9da8306a40 101
Yamasaki Taro 25:389d96280bcf 102 ss2 = 0;
Yamasaki Taro 25:389d96280bcf 103 data[0] = TempK.write(0x00);
Yamasaki Taro 25:389d96280bcf 104 data[1] = TempK.write(0x00);
Yamasaki Taro 25:389d96280bcf 105 ss2 = 1;
Yamasaki Taro 25:389d96280bcf 106 data[0] &= 0xfffc;
Yamasaki Taro 25:389d96280bcf 107 temp2 = (float)((int16_t)data[0]) * TEMP_LSB;
Yamasaki Taro 25:389d96280bcf 108
Yamasaki Taro 25:389d96280bcf 109 // Debug and Config section-----------------------------------------------------------------
Yamasaki Taro 38:67754c11cf6f 110 if (pc.readable() > 0)
Yamasaki Taro 38:67754c11cf6f 111 {
Yamasaki Taro 25:389d96280bcf 112 wireless.putc(pc.getc());
Yamasaki Taro 38:67754c11cf6f 113 if(!ConfigFlag)
Yamasaki Taro 38:67754c11cf6f 114 {
Yamasaki Taro 33:427d1bcfea60 115 ConfigFlag = true;
Yamasaki Taro 33:427d1bcfea60 116 }
Yamasaki Taro 25:389d96280bcf 117 }
Yamasaki Taro 38:67754c11cf6f 118 if(ConfigFlag)
Yamasaki Taro 38:67754c11cf6f 119 {
Yamasaki Taro 38:67754c11cf6f 120 while (wireless.readable() > 0)
Yamasaki Taro 38:67754c11cf6f 121 {
Yamasaki Taro 31:22dcdffbe5c2 122 pc.putc(wireless.getc());
Yamasaki Taro 31:22dcdffbe5c2 123 }
Yamasaki Taro 25:389d96280bcf 124 continue;
Yamasaki Taro 13:19fb33032ebb 125 }
Yamasaki Taro 13:19fb33032ebb 126 // -----------------------------------------------------------------------------------------
Yamasaki Taro 25:389d96280bcf 127
Yamasaki Taro 25:389d96280bcf 128 int time = timer.read_ms();
Yamasaki Taro 49:171de000bae0 129 if(time - dt >= 500)
Yamasaki Taro 38:67754c11cf6f 130 {
Yamasaki Taro 25:389d96280bcf 131 // Debug and Config section-----------------------------------------------------------------
Yamasaki Taro 38:67754c11cf6f 132 if (pc.readable() == 0 && wireless.readable() == 0)
Yamasaki Taro 38:67754c11cf6f 133 {
Yamasaki Taro 25:389d96280bcf 134 pc.printf("%d\t%d\t%d\t%f\t%f\r\n", timer.read_ms(), press_bit1, press_bit2, temp1, temp2);
Yamasaki Taro 25:389d96280bcf 135 }
Yamasaki Taro 25:389d96280bcf 136 // -----------------------------------------------------------------------------------------
Yamasaki Taro 25:389d96280bcf 137
Yamasaki Taro 50:c9f29b839c32 138 wireless.printf("Tank Pressure %d IsAPL_Enabled %s IsValveOpened %s.\r\n", press_bit1, APLFlug ? "true":"false" , IsValveOpened ? "true":"false" );
Yamasaki Taro 25:389d96280bcf 139 dt = time;
Yamasaki Taro 25:389d96280bcf 140 }
Yamasaki Taro 35:c6457c5ce996 141 //valvcontroler auto pressure limitation----------------------------------------------------
Yamasaki Taro 42:51976ccf669d 142 if(wireless.readable() > 0)
Yamasaki Taro 42:51976ccf669d 143 {
Yamasaki Taro 44:3be8f867063e 144 // This support only single lettar.
Yamasaki Taro 45:7e9d6dc429e4 145 char up_msg = wireless.getc();
Yamasaki Taro 44:3be8f867063e 146
Yamasaki Taro 50:c9f29b839c32 147 //wireless.printf("Message = %c.",up_msg);
Yamasaki Taro 48:70d45f006192 148
Yamasaki Taro 45:7e9d6dc429e4 149 if (up_msg == 'o') //open
Yamasaki Taro 44:3be8f867063e 150 {
Yamasaki Taro 50:c9f29b839c32 151 ValveOpen();
Yamasaki Taro 44:3be8f867063e 152 APLFlug = false;
Yamasaki Taro 44:3be8f867063e 153 }
Yamasaki Taro 45:7e9d6dc429e4 154 else if (up_msg == 'c') //close
Yamasaki Taro 44:3be8f867063e 155 {
Yamasaki Taro 50:c9f29b839c32 156 ValveClose();
Yamasaki Taro 44:3be8f867063e 157 APLFlug = false;
Yamasaki Taro 44:3be8f867063e 158 }
Yamasaki Taro 47:4bef9e4ebbc8 159 else
Yamasaki Taro 44:3be8f867063e 160 {
Yamasaki Taro 47:4bef9e4ebbc8 161 if (// These must be just responses. ← とも言い切れなくなった。なにもしてなかったのにprintfされたり、間違ったコマンドを送信したのに反応が無かったりした。
Yamasaki Taro 46:64cd35651ce0 162 up_msg != 'O'
Yamasaki Taro 46:64cd35651ce0 163 && up_msg != 'K'
Yamasaki Taro 46:64cd35651ce0 164 && up_msg != 'N'
Yamasaki Taro 46:64cd35651ce0 165 && up_msg != 'G'
Yamasaki Taro 46:64cd35651ce0 166 && up_msg != ' '
Yamasaki Taro 46:64cd35651ce0 167 && up_msg != '0'
Yamasaki Taro 46:64cd35651ce0 168 && up_msg != '1'
Yamasaki Taro 46:64cd35651ce0 169 && up_msg != '2'
Yamasaki Taro 46:64cd35651ce0 170 && up_msg != '3'
Yamasaki Taro 46:64cd35651ce0 171 && up_msg != '4'
Yamasaki Taro 46:64cd35651ce0 172 && up_msg != '5'
Yamasaki Taro 46:64cd35651ce0 173 && up_msg != '6'
Yamasaki Taro 46:64cd35651ce0 174 && up_msg != '7'
Yamasaki Taro 46:64cd35651ce0 175 && up_msg != '8'
Yamasaki Taro 46:64cd35651ce0 176 && up_msg != '9'
Yamasaki Taro 50:c9f29b839c32 177 && up_msg != '\0'
Yamasaki Taro 50:c9f29b839c32 178 && up_msg != '\r'
Yamasaki Taro 50:c9f29b839c32 179 && up_msg != '\n'
Yamasaki Taro 46:64cd35651ce0 180 ){
Yamasaki Taro 47:4bef9e4ebbc8 181 wireless.printf("You send invaild command.\r\n");
Yamasaki Taro 44:3be8f867063e 182 }
Yamasaki Taro 44:3be8f867063e 183 }
Yamasaki Taro 42:51976ccf669d 184 }
Yamasaki Taro 38:67754c11cf6f 185 if(APLFlug)
Yamasaki Taro 38:67754c11cf6f 186 {
Yamasaki Taro 38:67754c11cf6f 187 if(press_bit1 > Threshold)
Yamasaki Taro 38:67754c11cf6f 188 {
Yamasaki Taro 50:c9f29b839c32 189 ValveOpen();
Yamasaki Taro 35:c6457c5ce996 190 }
Yamasaki Taro 35:c6457c5ce996 191 else{
Yamasaki Taro 50:c9f29b839c32 192 ValveClose();
Yamasaki Taro 35:c6457c5ce996 193 }
Yamasaki Taro 29:30fdcbbbe79a 194 }
Yamasaki Taro 31:22dcdffbe5c2 195 //------------------------------------------------------------------------------------------
Yamasaki Taro 25:389d96280bcf 196 fprintf(fp, "%d\t%d\t%d\t%f\t%f\r\n", time, press_bit1, press_bit2, temp1, temp2);
Yamasaki Taro 25:389d96280bcf 197
Yamasaki Taro 25:389d96280bcf 198 if(sd_timer.read_ms() > 20*1000) {
Yamasaki Taro 25:389d96280bcf 199 if(fp) {
Yamasaki Taro 25:389d96280bcf 200 fclose(fp);
Yamasaki Taro 25:389d96280bcf 201 fp = fopen(file_name, "a");
Yamasaki Taro 25:389d96280bcf 202 }
Yamasaki Taro 25:389d96280bcf 203 }
Yamasaki Taro 4:83855f14a087 204 }
Yamasaki Taro 1:655abe8ab309 205 }
Yamasaki Taro 43:09551ed0f46b 206 // If you feel this ugly, please refactor THIS !!.