DTux
/
dtux__polsensors
Archived
1
0
Fork 0
This repository has been archived on 2023-11-30. You can view files and clone it, but cannot push or open issues or pull requests.
dtux__polsensors/multidetecteur.ino

263 lines
5.7 KiB
C++

#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <uRTCLib.h>
#define DHTPIN 6
#define DHTTYPE DHT22
#define LOG_PERIOD 60000 // cetak tiap detik
DHT dht(DHTPIN, DHTTYPE);
struct
{
uint32_t total;
uint32_t ok;
uint32_t crc_error;
uint32_t time_out;
uint32_t unknown;
} stat = { 0,0,0,0,0 };
// Identificateur pour l'affichage
const int UV = 0;
const int TEMP = 1;
const int HUMID = 2;
const int RAD = 3;
const int BATTERY = 4;
const int PARTICULES = 5;
// Buttons Pins
const int BSELECT = 4;
const int BUP = 2;
const int BDOWN = 5;
const int TEMP_HUMID = 6;
int posaffich = 0; // position actuelle de l'affichage
int max_posaffich = 5; // nombre de valeur à afficher moins 1
int UVOUT = A0; //Output from the sensor
int REF_3V3 = A1; //3.3V power on the Arduino board
//int UVsensorIn = A0; //Output from the sensor
//int REFsensorIn = A1;
LiquidCrystal_I2C lcd(0x27,8,2);
byte bouton;
unsigned long counts; //variable for GM Tube events
unsigned long previousMillis;//variable for time measurement
String texts[6]= {"UV int:", "Temp", "Humid", "Bq/mn", "Part/s", "Battery"};
float values[6];
float tab[6][60];
float total[6];
unsigned int index = 1;
float lisse( int capteur, float valeur)
{
total[capteur] = total[capteur]-tab[capteur][index]+valeur;
tab[capteur][index] = valeur;
return total[capteur] / 60;
}
void impulse() { // dipanggil setiap ada sinyal FALLING di pin 2
counts++;
}
void setup()
{
pinMode(UVOUT, INPUT);
pinMode(REF_3V3, INPUT);
pinMode(BSELECT, INPUT_PULLUP);
pinMode(BUP, INPUT_PULLUP);
pinMode(BDOWN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(3), impulse, FALLING); //define external interrupts
Serial.println("Start counter");
// pinMode(UVsensorIn, INPUT);
// pinMode(REFsensorIn, INPUT);
Serial.begin(9600); //open serial port, set the baud rate to 9600 bps
dht.begin();
lcd.init();
lcd.init();
lcd.setCursor(0,0);
lcd.clear();
lcd.print("hello");
delay(1000);
}
void loop()
{
bouton = test_bouton(); //retourne la valeur entre
Serial.print( "position afficheur =>" );
Serial.print( posaffich );
Serial.println();
lcd.clear();
values[UV] = uv();
values[TEMP] = temp();
values[HUMID] = humid();
values[RAD] = geiger();
values[PARTICULES] = particules();
values[BATTERY] = battery();
affich();
index++;
if (index > 60)
{
index=1;
}
}
void affich()
{
Serial.print( "position afficheur => " );
Serial.print( posaffich );
Serial.println();
lcd.clear();
Serial.print( "texte => ");
Serial.print( texts[posaffich] );
Serial.println();
lcd.setCursor(0,0);
lcd.print(texts[posaffich]);
lcd.setCursor(0,1);
lcd.print(values[posaffich]);
}
float uv()
{
float uvLevel = averageAnalogRead(UVOUT);
float refLevel = averageAnalogRead(REF_3V3);
// int uvLevel = averageAnalogRead(UVsensorIn);
// int refLevel = averageAnalogRead(REFsensorIn);
// Serial.print(" Ulevel: ");
// Serial.print(uvLevel);
// Serial.print(" reflevel");
// Serial.print(refLevel);
float outputVoltage = 3.3 * uvLevel/refLevel;
// Serial.print(" output voltage: ");
// Serial.print(outputVoltage);
float uvIntensity = mapfloat(outputVoltage, 0.97, 2.9, 0.0, 15.0);
Serial.print(" UV Intensity: ");
Serial.print(uvIntensity);
// Serial.print(" mW/cm^2");
// Serial.print(" input:");
// Serial.print(uvLevel);
Serial.println();
return uvIntensity;
}
//Takes an average of readings on a given pin
//Returns the average
int averageAnalogRead(int pinToRead)
{
byte numberOfReadings = 20;
float runningValue = 0;
float Value = 0;
for(int x = 0 ; x < numberOfReadings ; x++)
{
float val = analogRead(pinToRead);
runningValue += val;
}
Value = runningValue / (float)numberOfReadings;
return Value;
}
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
byte test_bouton()
{
if ( digitalRead( BSELECT ) == 0)
{
// put here the code if select button is pushed
Serial.print( "SELECT" );
Serial.println();
return BSELECT;
}else if ( digitalRead( BUP ) == 0 )
{
// code for button up pushed
Serial.print( "UP" );
Serial.println();
if ( posaffich == 0 )
{
posaffich = max_posaffich;
}else
{
posaffich--;
}
return BUP;
}else if ( digitalRead( BDOWN ) == 0 )
{
// code for button down pushed
Serial.print( "Down" );
Serial.println();
if ( posaffich == max_posaffich )
{
posaffich = 0;
}else
{
posaffich++;
}
return BDOWN;
}
return 0;
}
float temp()
{
float t = dht.readTemperature();
if (isnan(t)) {
Serial.println("Failed to read temperature from DHT");
return -199;
} else {
return t;
}
}
float humid()
{
float h = dht.readHumidity();
if (isnan(h)) {
Serial.println("Failed to read humidity from DHT");
return -1;
} else {
return h;
}
}
float geiger()
{
//here the code for acquiring radiations
//affich(RAD, text, value);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > LOG_PERIOD) {
previousMillis = currentMillis;
Serial.println(counts);
return counts; // affiche le nombre de particules comptées en une minute
counts = 0;
}
}
float particules()
{
//here the code for acquiring particules
//affich(PARTICULES, text, value);
}
float battery()
{
//here the code for acquiring battery
//affich(BATTERY, text, value);
unsigned int sondeBat = analogRead(A2);
float b = (sondeBat * (( 3.7 / 1024 )) / 0.6);
Serial.print("Batterie:");
Serial.println(b);
}