/****************
10Kpa
1 Nc 2 Nc 3 GRN 4 VDD 5 OUT 6 Nc
****************/
//SSD1306
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET 8 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
float value = 1000;
float Volto;
float KPA;
float MKPA;
float CAB = 1.235;
float a0 = 1023;
unsigned long Time;
unsigned long M_Time;
unsigned long C_Time;
unsigned long R_Time;//BMS-Kパルス用
int hh,mm,ss;
unsigned long TIMECount;
int DATA[121];
void setup() {
pinMode(A0, INPUT); //sensorアナログ入力
pinMode(A1, INPUT); //5V基準アナログ入力
pinMode(A2, OUTPUT); //センサー用5V出力
pinMode(A3, OUTPUT); //センサー用GND
pinMode(13, OUTPUT);//BMS-Kパルス用
digitalWrite(A2, HIGH);
digitalWrite(A3, LOW);
pinMode(2, INPUT_PULLUP); //SWデジタル入力
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //ディスプレイの初期化
display.clearDisplay(); //ディスプレイをクリア
display.setTextColor(WHITE); //文字色を設定
display.setTextSize(3); //文字サイズを設定
display.setCursor(0, 0); //文字の開始位置を設定
display.print("Standby"); //ディスプレイ出力文字
display.display(); //上記条件でディスプレイ表示
delay(1000);
for ( int i=0 ; i < 121 ; i++ ){ //データスライド
DATA[i] = 64;
}
display.clearDisplay(); //ディスプレイをクリア
M_Time = millis() / 1000;
R_Time = millis() + 20000;//BMS-Kパルス用 20秒
}
void loop() {
if (R_Time < millis() ) {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
R_Time = millis() + 20000;
}
if (Time < millis() / 1000) {
Time = (millis() + 100) / 1000;
Pressure();
KPA = KPA - CAB;
C_Time = Time - M_Time;
hh = C_Time / 60 / 60 ;
mm = C_Time / 60 % 60 ;
ss = C_Time % 60 ;
Guraf();
DIS();
}
}
void Pressure() {
for (int i = 0; i < 30; i++) {
value = (value * 0.9) + (analogRead(A0) * 0.1); //ローパスフィルター
a0 = (a0 * 0.9) + (analogRead(A1) * 0.1);
}
Volto = ((value*(1023/a0))/ 1023) * 5; //0~5Vの値に変換
//Volto = map(Volto*1000, 500, 4500, 0, 1000);
//KPA=Volto/100;
KPA = (100 / 0.4) * Volto / 100; //0.5~4.5V =4(定数)
//Volto = map(Volto, 500, 4500, 0, 1000);
//if ( MQ_value < CAB ){CAB = MQ_value;}
//MQ_PPM = MQ_value-CAB ;
// 10 kPa = 101.97 cmH2O
// 1 MPa = 1,000 kPa
// 0~0.68947573PPM(100PSI)
// 0.5V~4.5V
//102.4~921.6(1V=204.8)
delay(10);
}
void DIS() {
display.clearDisplay(); //ディスプレイをクリア
// 圧力表示
display.setCursor(0, 43); //文字の開始位置を設定
display.setTextSize(3); //文字サイズを設定
if (KPA < 0 or KPA > 10) {
display.print(KPA, 2);
} else {
display.print(KPA, 3);
}
display.setTextSize(2); //文字サイズを設定
display.setCursor(90, 50);
display.print("KPa");
//経過時間表示
display.setTextSize(1); //文字サイズを設定
display.setCursor(60, 0);
if ( hh >= 1) {
display.print( hh );
display.print("h");
}
else{
display.print(" ");
}
if (mm < 10) {
display.print("0");
}
display.print(mm);
display.print("m");
if ( ss < 10) {
display.print("0");
}
display.print( ss );
display.print("s");
for ( int i=1 ; i <= 120 ; i++ ){ //データスライド
//display.drawPixel(i, DATA[i], WHITE); //点を書く
display.drawLine( i-1 ,DATA[i-1] , i ,DATA[i] , WHITE); //線を引く
}
display.setTextSize(1); //文字サイズを設定
display.setCursor(0, 3);
display.print("8.4Kpa");
display.drawLine( 0,11,128,11, WHITE); //線を引く
display.setTextSize(1); //文字サイズを設定
display.setCursor(0, 31);
display.print("5.5Kpa");
display.drawLine( 0,39,128,39, WHITE); //線を引く
display.display(); //上記条件でディスプレイ表示
}
void Guraf(){
for ( int i=0 ; i <= 120 ; i++ ){ //データスライド
DATA[i] = DATA[i+1];
}
DATA[120]=KPA*10; // 正数に変換
DATA[120]=map( DATA[120],30,95,63,0);//map( DATA[120],0,700,31,0);
if ( DATA[120] < 0 ){DATA[120]=0;}
if ( DATA[120] > 63 ){DATA[120]=63;}
}