valve measurement board

Dependencies:   mbed ads1115_test SDFileSystem

main.cpp

Committer:
Yamasaki Taro
Date:
2021-03-08
Branch:
UplinkEnabled
Revision:
43:09551ed0f46b
Parent:
42:51976ccf669d
Child:
44:3be8f867063e

File content as of revision 43:09551ed0f46b:

#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 >= 100)
		{
			// 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\r\n", press_bit1);
			dt = time;
		}
		//valvcontroler auto pressure limitation----------------------------------------------------
		if(wireless.readable() > 0)
		{
			UplinkHundle();
		}
		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\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");
			}
		}
	}
}

void UplinkHundle()
{
	// This support only single lettar.
	char message = wireless.getc();

	if (message == 'o') //open
	{
		valve_controler1 = 1;
		valve_controler2 = 1;
		APLFlug = false;
	}
	else if (message == 'c') //close
	{
		valve_controler1 = 0;
		valve_controler2 = 0;
		APLFlug = false;
	}
	else
	{
		if (!(
				   message == 'O' 
				|| message == 'K'
				|| message == 'N'
				|| message == 'G'
				|| message == ' '
				|| message == '0'
				|| message == '1'
				|| message == '2'
				|| message == '3'
				|| message == '4'
				|| message == '5'
				|| message == '6'
				|| message == '7'
				|| message == '8'
				|| message == '9'
		     )){
			wireless.printf("You send invaild command.\r\n\r\n");
		}
	}
}
// If you feel this ugly, please refactor THIS !!.