//Лабораторна робота 2
//Аналогове введення сигналів
//Варіант 7
//ADC Light sensor resolution 6 bit
//ADC temperature sensor resolution 11 bit
#define DIP1 53 //пін перемикача
#define TemperatureSensor A1 //пін датчика температури
#define LightSensor A0 //пін датчика освітленості
#define MinIlluminations 0.1 //мінімальне значення освітленості
#define MaxIlluminations 100000.0 //максимальне значення освітленості
#define MinTemperature -25 //мінімальне значення температури
#define MaxTemperature 79 //максимальне значення температури
#define StartLEDPin 38 //стартовий пін підключення світлодіодів
#define EndLEDPin 45 //кінцевий пін підключення світлодіодів
const float GAMMA = 0.7; //гамма коефіцієнт
const float RL10 = 50; //LDR резистор освітденості
const float BETA = 3950; //бета коефіціент термістора
void setup() {
//ініціалізуємо піни світлодіодів на вивід
for (byte i = StartLEDPin; i <= EndLEDPin; i++){
pinMode(i, OUTPUT);
}
pinMode(DIP1, INPUT_PULLUP); //ініціалізуємо пін перемикача
pinMode(A0, INPUT); //ініціалізуємо пін датчика освітленості
pinMode(A1, INPUT); //ініціалізуємо пін датчика температури
Serial.begin(9600);
}
void loop() {
if (digitalRead(DIP1) == LOW){
//analogReadResolution(11);
int analogValue = analogRead(TemperatureSensor);
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
int LEDCalc = map(celsius, MinTemperature, MaxTemperature, 38, 45);
Serial.print("Temperature: ");
Serial.println(celsius);
for (int i = StartLEDPin; i <= LEDCalc; i++){
if (celsius < -23) break;
digitalWrite(i, HIGH);
}
delay(500);
for (int i = StartLEDPin; i <= EndLEDPin; i++){
digitalWrite(i, LOW);
}
} else {
//analogReadResolution(6);
int analogValue = analogRead(LightSensor);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
float LEDCalc = map(lux, MinIlluminations, MaxIlluminations, 38, 45);
Serial.print("Light: ");
Serial.println(lux);
for (int i = StartLEDPin; i <= LEDCalc; i++){
if (lux < 0.2) break;
digitalWrite(i, HIGH);
}
delay(500);
for (int i = StartLEDPin; i <= EndLEDPin; i++){
digitalWrite(i, LOW);
}
}
}