圧力監視と制御
Dependencies: ads1115_test DS1820_HelloWorld IM920
Diff: main.cpp
- Revision:
- 0:c17f6898d7a7
diff -r 000000000000 -r c17f6898d7a7 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Mar 09 05:06:00 2022 +0000 @@ -0,0 +1,154 @@ + +#include "mbed.h" +#include "IM920.h" +#include "DS1820.h" +#include "Adafruit_ADS1015.h" + +#define ADS1115_ADDR 0b1001000 + + +//コンストラクタ------------------------------------------------------------------ +Serial pc(USBTX, USBRX, 115200); +Serial im920_serial(p28, p27, 115200); + +IM920 im920(im920_serial, pc, 115200); +DigitalIn im920_busy(p29); + +DigitalOut kettle(p18); +DigitalOut pump(p19); + +DS1820 ds1820(p30); + +I2C m_i2c(p9, p10); +Adafruit_ADS1115 ads1115(&m_i2c, ADS1115_ADDR); +//------------------------------------------------------------------------------ + +//変数--------------------------------------------------------------------------- +int pump_state = 0; +int kettle_state = 0; +float temp; +int pres_bit; +float pres; +//受信機側で開始時に設定 +float set_temp; +float set_pres; +//------------------------------------------------------------------------------ + +//定数--------------------------------------------------------------------------- +//圧力センサの校正係数 +float a = 0.000653692; +float b = -1.548466; +//------------------------------------------------------------------------------ + +//無線ヘッダー-------------------------------------------------------------------- +const char header_uplink = 1; +const char header_downlink = 2; +//------------------------------------------------------------------------------ + +//関数--------------------------------------------------------------------------- +void upLink(); +void downLink(); +void readTemp(); +void controlTemp(); +void readPres(); +void controlPres(); +//------------------------------------------------------------------------------ + + + +// メイン関数--------------------------------------------------------------------- +int main() +{ + im920.attach(&upLink, header_uplink); + ads1115.setGain(GAIN_TWOTHIRDS); + kettle = 0; + pump = 0; + pc.printf("start\r\n"); + + while(1) { + upLink(); + wait(1); + } +} +//------------------------------------------------------------------------------ + + +void upLink() +{ + pc.printf("wait\r\n"); + + if(im920.data[1] == '0') { + kettle = 0; + pump = 0; + pc.printf("stop\r\n"); + } + + else if(im920.data[1] == '1') { + set_temp = (float)im920.toFloat(2); + set_pres = (float)im920.toFloat(6); + pc.printf("%f\r\n", set_temp); + pc.printf("%f\r\n", set_pres); + controlTemp(); + controlPres(); + downLink(); + } + +} + +void downLink() +{ + im920.header(header_downlink); + im920.write((char)pump_state); + im920.write((char)kettle_state); + im920.write((float)temp); + im920.write((float)pres); + + if(im920_busy == 0) { + im920.send(); + } +} + +void readTemp() +{ + ds1820.convertTemperature(true, DS1820::all_devices); + temp = ds1820.temperature(); +} + +void controlTemp() +{ + readTemp(); + if (temp < set_temp) { + kettle = 1; + kettle_state = 1; + pc.printf("kettle on :: %f[oC]\r\n", temp); + } + + else if (temp > set_temp + 5.0) { + kettle = 0; + kettle_state = 0; + pc.printf("kettle off :: %f[oC]\r\n", temp); + } +} + +void readPres() +{ + pres_bit = ads1115.readADC_SingleEnded(0); + pres = pres_bit * a + b; +} + +void controlPres() +{ + readPres(); + if (pres < set_pres) { + pump = 1; + pump_state = 1; + pc.printf("pummp on :: %f[MPa]\r\n", pres); + } + + else if (pres > set_pres + 0.1) { + pump = 0; + pump_state = 0; + pc.printf("pummp off :: %f[MPa]\r\n", pres); + } +} +