1

Тема: Термометр на RGB, Attiny13 и DS18B20

Как-то попался мне проект термометра на Attiny13, DS18B20 и светодиодах.
Думаю что прикольная штука могла б получится при такой логике:
От синего до красного, 35 -39. Термометр был бы мелкий и наглядный.
Конечно точность DS18B20 хромает, но  читал  даташит, ьам упоминается программное повышение точности до 0,1 градуса, что весьма неплохо.

2

Re: Термометр на RGB, Attiny13 и DS18B20

Просто на rgb или на адресной ленте rgb?

3

Re: Термометр на RGB, Attiny13 и DS18B20

liman324 пишет:

Просто на rgb или на адресной ленте rgb?

Просто RGB. Что б менял цвет от синего к красному в диапазоне =<35 до >=39.
Весь прикол мне видится в миниатюрности и наглядности.
А если наворотить, так вообще: например датчик положения, что б при встряхивании сбрасывался(светит белым).
И засыпал через пять минут после последнего изменения температуры.
Будить так же можно встряхиванием.
Уф! Чет нафантазировал я жестко smile
.. Но это наверное невозможно в Attiny13 впихнуть.

4 (2024-03-19 13:40:06 отредактировано klause)

Re: Термометр на RGB, Attiny13 и DS18B20

Навскидку нашрайбал. Условия задания не очень точны. При включении горит белым. Потом до 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;
}