Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evsusy/e081ee3425abf1a1436092e9b558c658 to your computer and use it in GitHub Desktop.
Save evsusy/e081ee3425abf1a1436092e9b558c658 to your computer and use it in GitHub Desktop.
//Serial communication between ARDUINO and/or node MCU - Program of Master
// RODRIGUEZ-GAMBOA, JUAN C. & ALBARRACIN-ESTRADA, E. SUSANA
// - E-MAIL: {juan.gamboa,eva.susana}@ufrpe.br
// Libraries
#include <string.h>
#include "TimerOne.h"
const byte button = 2; // Digital pin when is wired the button
const int led=13;
const int gas_S1=A0;
const int gas_S2=A1;
const int gas_S3=A2;
const int gas_S4=A3;
const int gas_S5=A4;
const int gas_S6=A5;
const int air_pump=12;
const int valve1=9;
const int valve2=10;
const int valve3=11;
String data_received="";
char var[8];
float time_conf=0;
float sensor1;
float sensor2;
float sensor3;
float sensor4;
float sensor5;
float sensor6;
int state=0;
int meter=0;
int time_state1=10;
int time_state2=20;
int time_state3=10;
bool button_status = false;
bool timeout=false;
bool flag=false;
void configuration(void);
bool send_data(float number);
void to_receive(void);
void tCallback (void) { timeout=true;}
void push_button(void) {
button_status=true;
delay(100);
if (flag==false) {
flag=true;
state=1;
meter=0;
}
}
void setup()
{
Serial.begin(38400); //Open serial port communication
attachInterrupt(digitalPinToInterrupt(button),push_button,FALLING);
Timer1.initialize(333333);
Timer1.attachInterrupt(tCallback);
pinMode(led, OUTPUT);
pinMode(air_pump, OUTPUT);
pinMode(valve1, OUTPUT);
pinMode(valve2, OUTPUT);
pinMode(valve3, OUTPUT);
}
void loop()
{
if (timeout)
{
meter++;
if (state==2)
{ timeout=false;
read_sensor();
}
timeout=false;
}
if (flag==true && state!=0 && meter==0)
{
configuration();
delay(1000);
}
if (state!=0 && meter!=0)
{
switch (state)
{
//gas concentration
case 1:
if ((meter/3)>=time_state1)
{ state=2;
meter=0;
}
break;
case 2:
if ((meter/3)>=time_state2) {
state=3;
meter=0;
}
break;
case 3:
if ((meter/3)>=time_state3) {
state=4;
flag=false;
meter=0;
}
break;
}
}
}
void read_sensor(void)
{
sensor1=analogRead(gas_S1)*5.0/1024.0;
String fild="s1";
send_data(sensor1,fild);
delay(40);
sensor2=analogRead(gas_S2)*5.0/1024.0;
fild="s2";
send_data(sensor2,fild);
delay(40);
sensor3=analogRead(gas_S3)*5.0/1024.0;
fild="s3";
send_data(sensor3,fild);
delay(40);
sensor4=analogRead(gas_S4)*5.0/1024.0;
fild="s4";
send_data(sensor4,fild);
delay(40);
sensor5=analogRead(gas_S5)*5.0/1024.0;
fild="s5";
send_data(sensor5,fild);
delay(40);
sensor6=analogRead(gas_S6)*5.0/1024.0;
fild="s6";
send_data(sensor6,fild);
}
void configuration(void)
{
switch (state)
{
//gas concentration
case 1:
Serial.println("Gas concentration");
digitalWrite(air_pump,LOW);
digitalWrite(valve1,LOW);
digitalWrite(valve2,LOW);
digitalWrite(valve3,HIGH);
break;
//measurement
case 2:
Serial.println("Measurement");
digitalWrite(valve3,LOW);
digitalWrite(air_pump,HIGH);
digitalWrite(valve1,HIGH);
digitalWrite(valve2,HIGH);
break;
//purge
case 3:
Serial.println("Purge");
digitalWrite(air_pump,HIGH);
digitalWrite(valve1,HIGH);
digitalWrite(valve2,HIGH);
digitalWrite(valve3,HIGH);
break;
case 4:
Serial.println("Measurement finished");
digitalWrite(air_pump,LOW);
digitalWrite(valve1,LOW);
digitalWrite(valve2,LOW);
digitalWrite(valve3,LOW);
flag=false;
state=0;
break;
}
}
bool send_data(float number, String fild)
{
dtostrf(number,2,2, var);
Serial.flush();
char cadena[4];
fild.toCharArray(cadena,4);
Serial.write(cadena);
Serial.write('\n');
delay(1);
Serial.flush();
Serial.write(var);
Serial.write('\n');
delay(5);
Serial.flush();
digitalWrite(led,HIGH);
return true;
}
void to_receive(void)
{
Serial.flush();
delay(5);
if (Serial.read()=="conf")
{
data_received="";
data_received=Serial.read();
char cadena[4];
data_received.toCharArray(cadena,4);
time_conf = strtod(cadena,NULL);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment