const int PIN_R = 9, PIN_G = 10, PIN_B = 11; // пиновете за различните цветове (важно е да са ШИМ/PWM)
const int A_LDR = A0, A_TEMP = A1; // аналогови пинове, които слушат фоторезистора (LDR) и температурния сензор, който е тип TMP36
// максимални гранични стойности за осветление и температура
const int LIGHT_LOW_ADC = 350; // тъмно при по-ниски стойности
const float TEMP_HIGH_C = 28.0;
// задаване на цвят
void setColor(int r, int g, int b) {
analogWrite(PIN_R, r);
analogWrite(PIN_G, g);
analogWrite(PIN_B, b);
}
// update-ване на цвят, спрямо стойностите на темпертаурния сензор и фоторезистора
// светването на червено поради висока стойност на температурния сензор е с приоритет
// пред светването на синьо поради ниска осветеност
void updateColor(float tempC, int ldr) {
if (tempC >= TEMP_HIGH_C) {
setColor(255, 0, 0); // червено = горещо
} else if (ldr <= LIGHT_LOW_ADC) {
setColor(0, 0, 255); // синьо = тъмно
} else {
setColor(0, 255, 0); // зелено = нормално
}
}
void setup() {
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
Serial.begin(9600);
}
void loop() {
// прочитане на температура спрямо формула за температурния сензор
float temperature = map(((analogRead(A_TEMP) - 20) * 3.04), 0, 1023, -40, 125);
// прочитане на ниво за осветеност
int lightLevel = analogRead(A_LDR);
// използване на горе написаната функция за update-ване на цвят
updateColor(temperature, lightLevel);
// print на стойностите, прочетени от сензорите
Serial.print("Temp = ");
Serial.print(temperature);
Serial.print("degC | Light ADC = ");
Serial.println(lightLevel);
delay(300);
}