圧力監視と制御

Dependencies:   ads1115_test DS1820_HelloWorld IM920

main.cpp

Committer:
nakumur
Date:
2022-03-09
Revision:
0:c17f6898d7a7

File content as of revision 0:c17f6898d7a7:


#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);
    }
}