Навскидку нашрайбал. Условия задания не очень точны. При включении горит белым. Потом до 35гр. мигает синим.После 39гр. мигает красный. В интервале температур горят синий - зеленый-красный. Датчик или кнопка подключается между Reset и Gnd. Режим энергосбережения не включен.Выключение через 5мин. Вариант не финальный.
#include <avr/sleep.h>
#include <avr/power.h>
const unsigned long Alarm = 300000; // alarm time - 5 minutes
unsigned long StartTime = 0; // start time
const int OUT = 4; // DS18b20
const int RedPin = 0; // красный
const int GreenPin = 1;// зелёный
const int BluePin = 2; // синий
void setup () {
ADCSRA &= ~(1<<ADEN);// disable ADC
pinMode(RedPin, OUTPUT);
pinMode(GreenPin, OUTPUT);
pinMode(BluePin, OUTPUT);
pinMode(OUT, INPUT_PULLUP);
for(byte i=0;i<3;i++){digitalWrite(i,HIGH);}
delay(2000);
for(byte i=0;i<3;i++){digitalWrite(i,LOW);}
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
void loop () {
int t = read_temp();
if (millis() - StartTime < Alarm){
if(t<350){digitalWrite(2,HIGH);delay(1000);digitalWrite(2,LOW);delay(1000);}// Интервалы температур.
if(t>=350&&t<365){digitalWrite(2,HIGH);digitalWrite(0,LOW);digitalWrite(3,LOW);}
else { digitalWrite(2,LOW);}
if(t>=365&&t<375){digitalWrite(1,HIGH);digitalWrite(2,LOW);digitalWrite(3,LOW);}
else { digitalWrite(1,LOW);}
if(t>=375&&t<=390){digitalWrite(0,HIGH);digitalWrite(1,LOW);digitalWrite(2,LOW);}
if(t>390){digitalWrite(0,HIGH);delay(1000);digitalWrite(0,LOW);delay(1000);}
}
// sleep_enable();
// sleep_mode();
// Continue after reset
}
// reset
uint8_t therm_reset(){
uint8_t i;
PORTB &= ~(1 << OUT);
DDRB |= (1 << OUT);
delayMicroseconds(480);
DDRB &= ~(1 << OUT);
delayMicroseconds(60);
i=((PINB >> OUT) & 1);
delayMicroseconds(420);
return i;
}
// write bit
void therm_write_bit(uint8_t bit){
PORTB &= ~(1 << OUT);
DDRB |= (1 << OUT);
delayMicroseconds(1);
if(bit) DDRB &= ~(1 << OUT);
delayMicroseconds(60);
DDRB &= ~(1 << OUT);
}
// read bit
uint8_t therm_read_bit(void){
uint8_t bit=0;
PORTB &= ~(1 << OUT);
DDRB |= (1 << OUT);
delayMicroseconds(1);
DDRB &= ~(1 << OUT);
delayMicroseconds(14);
if(PINB & (1 << OUT)) bit=1;
delayMicroseconds(45);
return bit;
}
// read byte
uint8_t therm_read_byte(void){
uint8_t i=8, n=0;
while(i--){n>>=1;n|=(therm_read_bit()<<7);}
return n;
}
// write byte
void therm_write_byte(uint8_t byte){
uint8_t i=8;
while(i--){therm_write_bit(byte&1);byte >>= 1;
}
}
// read temp
int read_temp(){
uint8_t temperature[2];
float temper;
therm_reset();
therm_write_byte(0xCC);
therm_write_byte(0x44);
while(!therm_read_bit());
therm_reset();
therm_write_byte(0xCC);
therm_write_byte(0xBE);
temperature[0]=therm_read_byte();
temperature[1]=therm_read_byte();
therm_reset();
temper = (temperature[1] << 8 | temperature[0])*10/16;
return (int)temper;
}