126

Re: attiny13

Так-то да, там не столь важна точность, да и напряжение низкое - 1,2-3,5В.
Тут скорее вопрос корректности показаний - из-за наводок и маленького имеряемого может ерунду показывать. А если получится намотать 4-6В там уже будет интересно.

127 (2025-01-21 04:36:56 отредактировано klause)

Re: attiny13

nickolaus пишет:

liman324  Заменил, плюсовые точь в точь, а минусовые на 0.1 меньшеhttp://forum.rcl-radio.ru/uploads/images/2025/01/6b9ad6a0d14dea2d177e9344188a312a.png
http://forum.rcl-radio.ru/uploads/images/2025/01/dde6696da63f85a82e0a1ed194142216.png

Можно русифицировать текст.
1

.const char Message1[] PROGMEM = "TEMPERATURA";

2.

const uint8_t OLED_FONT[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //   0  
  0x06, 0x09, 0x09, 0x06, 0x00, // Значок градуса 8 
  0x00, 0x41, 0x22, 0x1c, 0x00, // ) 9 
  0x14, 0x08, 0x3E, 0x08, 0x14, // * 10
  0x08, 0x08, 0x3E, 0x08, 0x08, // + 11
  0x00, 0x00, 0xA0, 0x60, 0x00, // , 12
  0x08, 0x08, 0x08, 0x08, 0x08, // - 13
  0x00, 0x60, 0x60, 0x00, 0x00, // . 14
  0x20, 0x10, 0x08, 0x04, 0x02, // / 15
  0x3E, 0x41, 0x41, 0x41, 0x3E, // 0 16
  0x00, 0x42, 0x7F, 0x40, 0x00, // 1 17
  0x42, 0x61, 0x51, 0x49, 0x46, // 2 18
  0x21, 0x41, 0x45, 0x4B, 0x31, // 3 19
  0x18, 0x14, 0x12, 0x7F, 0x10, // 4 20
  0x27, 0x45, 0x45, 0x45, 0x39, // 5 21
  0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 22
  0x01, 0x71, 0x09, 0x05, 0x03, // 7 23
  0x36, 0x49, 0x49, 0x49, 0x36, // 8 24
  0x06, 0x49, 0x49, 0x29, 0x1E, // 9 25
  0x00, 0x36, 0x36, 0x00, 0x00, // : 26
  0x00, 0x56, 0x36, 0x00, 0x00, // ; 27
  0x08, 0x14, 0x22, 0x41, 0x00, // < 28
  0x14, 0x14, 0x14, 0x14, 0x14, // = 29
  0x00, 0x41, 0x22, 0x14, 0x08, // > 30
  0x02, 0x01, 0x51, 0x09, 0x06, // ? 31
  0x32, 0x49, 0x59, 0x51, 0x3E, // @ 32
  0x7C, 0x12, 0x11, 0x12, 0x7C, // A 33
  0x7F, 0x49, 0x49, 0x49, 0x36, // B 34
  0x3E, 0x41, 0x41, 0x41, 0x22, // C 35
  0x7F, 0x41, 0x41, 0x22, 0x1C, // D 36
  0x7F, 0x49, 0x49, 0x49, 0x41, // E 37
  0x7F, 0x09, 0x09, 0x09, 0x01, // F 38
  0x3E, 0x41, 0x49, 0x49, 0x7A, // G 39
  0x7F, 0x08, 0x08, 0x08, 0x7F, // H 40
  0x00, 0x41, 0x7F, 0x41, 0x00, // I 41
  0x20, 0x40, 0x41, 0x3F, 0x01, // J 42
  0x7F, 0x08, 0x14, 0x22, 0x41, // K 43
  0x7F, 0x40, 0x40, 0x40, 0x40, // L 44
  0x7F, 0x02, 0x0C, 0x02, 0x7F, // M 45
  0x7F, 0x04, 0x08, 0x10, 0x7F, // N 46
  0x3E, 0x41, 0x41, 0x41, 0x3E, // O 47
  0x7F, 0x01, 0x01, 0x01, 0x7F, // П 48
  0x3E, 0x41, 0x51, 0x21, 0x5E, // Q 49
  0x7F, 0x09, 0x09, 0x09, 0x06, // Р 50
  0x46, 0x49, 0x49, 0x49, 0x31, // S 51
  0x01, 0x01, 0x7F, 0x01, 0x01, // T 52
  0x07, 0x48, 0x48, 0x48, 0x3F, // У 53  
};

3. 

OLED_num(-8);//OLED_num(-9)

128

Re: attiny13

klause пишет:
nickolaus пишет:

liman324  Заменил, плюсовые точь в точь, а минусовые на 0.1 меньшеhttp://forum.rcl-radio.ru/uploads/images/2025/01/6b9ad6a0d14dea2d177e9344188a312a.png
http://forum.rcl-radio.ru/uploads/images/2025/01/dde6696da63f85a82e0a1ed194142216.png

Можно русифицировать текст.
1.const char Message1[] PROGMEM = "TEMPERATURA";
2.const uint8_t OLED_FONT[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //   0 
  0x06, 0x09, 0x09, 0x06, 0x00, // Значок градуса 8
  0x00, 0x41, 0x22, 0x1c, 0x00, // ) 9
  0x14, 0x08, 0x3E, 0x08, 0x14, // * 10
  0x08, 0x08, 0x3E, 0x08, 0x08, // + 11
  0x00, 0x00, 0xA0, 0x60, 0x00, // , 12
  0x08, 0x08, 0x08, 0x08, 0x08, // - 13
  0x00, 0x60, 0x60, 0x00, 0x00, // . 14
  0x20, 0x10, 0x08, 0x04, 0x02, // / 15
  0x3E, 0x41, 0x41, 0x41, 0x3E, // 0 16
  0x00, 0x42, 0x7F, 0x40, 0x00, // 1 17
  0x42, 0x61, 0x51, 0x49, 0x46, // 2 18
  0x21, 0x41, 0x45, 0x4B, 0x31, // 3 19
  0x18, 0x14, 0x12, 0x7F, 0x10, // 4 20
  0x27, 0x45, 0x45, 0x45, 0x39, // 5 21
  0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 22
  0x01, 0x71, 0x09, 0x05, 0x03, // 7 23
  0x36, 0x49, 0x49, 0x49, 0x36, // 8 24
  0x06, 0x49, 0x49, 0x29, 0x1E, // 9 25
  0x00, 0x36, 0x36, 0x00, 0x00, // : 26
  0x00, 0x56, 0x36, 0x00, 0x00, // ; 27
  0x08, 0x14, 0x22, 0x41, 0x00, // < 28
  0x14, 0x14, 0x14, 0x14, 0x14, // = 29
  0x00, 0x41, 0x22, 0x14, 0x08, // > 30
  0x02, 0x01, 0x51, 0x09, 0x06, // ? 31
  0x32, 0x49, 0x59, 0x51, 0x3E, // @ 32
  0x7C, 0x12, 0x11, 0x12, 0x7C, // A 33
  0x7F, 0x49, 0x49, 0x49, 0x36, // B 34
  0x3E, 0x41, 0x41, 0x41, 0x22, // C 35
  0x7F, 0x41, 0x41, 0x22, 0x1C, // D 36
  0x7F, 0x49, 0x49, 0x49, 0x41, // E 37
  0x7F, 0x09, 0x09, 0x09, 0x01, // F 38
  0x3E, 0x41, 0x49, 0x49, 0x7A, // G 39
  0x7F, 0x08, 0x08, 0x08, 0x7F, // H 40
  0x00, 0x41, 0x7F, 0x41, 0x00, // I 41
  0x20, 0x40, 0x41, 0x3F, 0x01, // J 42
  0x7F, 0x08, 0x14, 0x22, 0x41, // K 43
  0x7F, 0x40, 0x40, 0x40, 0x40, // L 44
  0x7F, 0x02, 0x0C, 0x02, 0x7F, // M 45
  0x7F, 0x04, 0x08, 0x10, 0x7F, // N 46
  0x3E, 0x41, 0x41, 0x41, 0x3E, // O 47
  0x7F, 0x01, 0x01, 0x01, 0x7F, // П 48
  0x3E, 0x41, 0x51, 0x21, 0x5E, // Q 49
  0x7F, 0x09, 0x09, 0x09, 0x06, // Р 50
  0x46, 0x49, 0x49, 0x49, 0x31, // S 51
  0x01, 0x01, 0x7F, 0x01, 0x01, // T 52
  0x07, 0x48, 0x48, 0x48, 0x3F, // У 53 
};
3.  OLED_num(-8);//OLED_num(-9)

а 3 пункт вместо какого?

129

Re: attiny13

Вместо OLED_num(-9). Это значок градуса, на любителя.
"
  OLED_num(-2);
    a0 = temp%10;
    OLED_num(a0);
    OLED_num(-9); // здесь поменять значение
    OLED_num(19);
    _delay_ms(10000);}
    OLED_clear();      "

130

Re: attiny13

Добрый деньliman324 Попробовал Термометр на DS18B20 с большими цифрамиссылка http://rcl-radio.ru/?p=112955, но беда при минусе вот что показываетhttp://forum.rcl-radio.ru/uploads/images/2025/01/cb915427469dcb757625566cf4459bae.png , при положительной температуре все хорошо. Подскажите где и что подправить.

131

Re: attiny13

Добрый день liman324 в сообщении 130 я просил посоветовать как сделать чтобы показывал отрицательные температуры, я нашел у вас на форуме,работает, но не значущий ноль портит всю картину при меньше 10. Подскажите как убрать плизhttp://forum.rcl-radio.ru/uploads/images/2025/01/03fcba4c070f6c8b724aa001a355d91b.png
.

132

Re: attiny13

Опубликуйте код который Вы используете.

133

Re: attiny13

как вставить код? копирую-вставляю Ошибка-нельзя вставлять теги в самого себя

134

Re: attiny13

http://forum.rcl-radio.ru/uploads/images/2025/01/648ce26f8f62285b69070975bfc4c740.png

135

Re: attiny13

Используйте <>

136

Re: attiny13

#include <avr/io.h>
#include <util/delay.h>
 
// Project Files (Github):  https://github.com/wagiminator/ATtiny13-TinyOLEDdemo
// License: http://creativecommons.org/licenses/by-sa/3.0/
 
#define I2C_SDA         PB3                   
#define I2C_SCL         PB4                  
#define TEMP            PB0
#define BUTTON          PB2
 
#define I2C_SDA_HIGH()  DDRB &= ~(1<<I2C_SDA) 
#define I2C_SDA_LOW()   DDRB |=  (1<<I2C_SDA) 
#define I2C_SCL_HIGH()  DDRB &= ~(1<<I2C_SCL) 
#define I2C_SCL_LOW()   DDRB |=  (1<<I2C_SCL) 

bool minus;
uint8_t buffer[8];
 
int main(void) {
    PORTB |=(1 << BUTTON);
    OLED_init();
    OLED_clear();                    
 
while(1) { 
    if(((PINB >> BUTTON) & 1) == 0){   
    int temp = read_temp();
    if(temp<0){minus=1;temp=-temp;}else{minus=0;}
    byte a0 = temp/100;
    byte a1 = temp/10%10;
    byte a2 = temp%10;
    if(minus==0){uint8_t buffer0[8] = {19, a0, a1, 16, a2, 19, 12, 19};OLED_printB(buffer0);}
     else{uint8_t buffer1[8] = {18, a0, a1, 16, a2, 19, 12, 19};OLED_printB(buffer1); }                                              
    _delay_ms(10000);}
    OLED_clear();                   
}}
 
///// I2C ///////////////////////////////////////////////////////
void I2C_init(void) {DDRB  &= ~((1<<I2C_SDA)|(1<<I2C_SCL)); PORTB &= ~((1<<I2C_SDA)|(1<<I2C_SCL));}
void I2C_write(uint8_t data) {
  for(uint8_t i = 8; i; i--) {I2C_SDA_LOW();                        
    if (data & 0x80) I2C_SDA_HIGH();I2C_SCL_HIGH();data<<=1;I2C_SCL_LOW();}
  I2C_SDA_HIGH();I2C_SCL_HIGH();asm("nop");I2C_SCL_LOW();                         
}
void I2C_start(uint8_t addr) {I2C_SDA_LOW();I2C_SCL_LOW();I2C_write(addr);}
void I2C_stop(void) {I2C_SDA_LOW();I2C_SCL_HIGH();I2C_SDA_HIGH();}
 
///// OLED ///////////////////////////////////
#define OLED_ADDR       0x78                  
#define OLED_CMD_MODE   0x00                  
#define OLED_DAT_MODE   0x40                  
#define OLED_INIT_LEN   15 
 
// OLED init settings
const uint8_t OLED_INIT_CMD[] PROGMEM = {
  0xA8, 0x1F,       
  0x22, 0x00, 0x03, 
  0x20, 0x01,       
  0xDA, 0x02,       
  0x8D, 0x14,       
  0xAF,             
  0x00, 0x10, 0xB0, 
  0xA1, 0xC8        
};
 
// Simple reduced 3x8 font
const uint8_t OLED_FONT[] PROGMEM = {
  0x7F, 0x41, 0x7F, // 0  0
  0x00, 0x00, 0x7F, // 1  1
  0x79, 0x49, 0x4F, // 2  2
  0x41, 0x49, 0x7F, // 3  3
  0x0F, 0x08, 0x7E, // 4  4
  0x4F, 0x49, 0x79, // 5  5
  0x7F, 0x49, 0x79, // 6  6
  0x03, 0x01, 0x7F, // 7  7
  0x7F, 0x49, 0x7F, // 8  8
  0x4F, 0x49, 0x7F, // 9  9
  0x7F, 0x09, 0x7F, // A 10
  0x7F, 0x48, 0x78, // b 11
  0x7F, 0x41, 0x63, // C 12
  0x78, 0x48, 0x7F, // d 13
  0x7F, 0x49, 0x41, // E 14
  0x7F, 0x09, 0x01, // F 15
  0x00, 0x60, 0x00, // . 16
  0x00, 0x36, 0x00, // : 17
  0x08, 0x08, 0x08, // - 18
  0x00, 0x00, 0x00  //   19
};
 
void OLED_cursor(uint8_t xpos, uint8_t ypos) {
  I2C_start(OLED_ADDR);                   
  I2C_write(OLED_CMD_MODE);               
  I2C_write(xpos & 0x0F);                 
  I2C_write(0x10 | (xpos >> 4));     
  I2C_write(0xB0 | (ypos & 0x07));    
  I2C_stop();                           
}
 
void OLED_clear(void) {
  OLED_cursor(0, 0);                      
  I2C_start(OLED_ADDR);                   
  I2C_write(OLED_DAT_MODE);              
  for(uint16_t i=512; i; i--) I2C_write(0x00); 
  I2C_stop();  
}
 
void OLED_init(void) {
  I2C_init();                             
  I2C_start(OLED_ADDR);                   
  I2C_write(OLED_CMD_MODE);               
  for (uint8_t i = 0; i < OLED_INIT_LEN; i++) I2C_write(pgm_read_byte(&OLED_INIT_CMD[i])); 
  I2C_stop();                            
}
 
uint8_t OLED_stretch(uint8_t b){b=((b & 2)<<3)|(b&1);b|=b<<1;b|=b<<2;return b;}
 
void OLED_printD(uint8_t ch) {
  uint8_t i, j, k, b;                     
  uint8_t sb[4];                          
  ch += ch << 1;                          
  for(i=8; i; i--) I2C_write(0x00);       
  for(i=3; i; i--) {                      
    b = pgm_read_byte(&OLED_FONT[ch++]);  
    for(j=0; j<4; j++, b >>= 2) sb[j] = OLED_stretch(b);  
    j=4; if(i==2) j=6;               
    while(j--) {                    
      for(k=0; k<4; k++) I2C_write(sb[k]);
}}}
 
void OLED_printB(uint8_t *buffer) {
  I2C_start(OLED_ADDR);      
  I2C_write(OLED_DAT_MODE);              
  for(uint8_t i=0; i<8; i++) OLED_printD(buffer[i]); 
  I2C_stop();                            
}
 
//// DS18B20 //////////////////////////////////////
uint8_t therm_reset(){
    uint8_t i;
    PORTB &= ~(1 << TEMP);
    DDRB |= (1 << TEMP);
    _delay_us(480);  
    DDRB &= ~(1 << TEMP);
    _delay_us(60);
    i=((PINB >> TEMP) & 1);
    _delay_us(420);
    return i;
}
void therm_write_bit(uint8_t bit){
    DDRB |= (1 << TEMP);
    if(bit) DDRB &= ~(1 << TEMP);
    _delay_us(60);
    DDRB &= ~(1 << TEMP);
}
uint8_t therm_read_bit(void){
    uint8_t bit=0;
    DDRB |= (1 << TEMP);
    DDRB &= ~(1 << TEMP);
    _delay_us(14);
    if(PINB & (1 << TEMP)) bit=1;
    _delay_us(45);
    return bit;
}
uint8_t therm_read_byte(void){
    uint8_t i=8, n=0;
    while(i--){n>>=1;n|=(therm_read_bit()<<7);}
    return n;
}
void therm_write_byte(uint8_t byte){
    uint8_t i=8;
    while(i--){therm_write_bit(byte&1);byte >>= 1;
    }}
int read_temp(){
    uint8_t temperature[2];
    int 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();
    return temper = (temperature[1] << 8 | temperature[0])*10/16;
}

137

Re: attiny13

byte a0 = temp/100;
if(a0<0){a0=19;}

138

Re: attiny13

уважаемый liman324 не получается http://forum.rcl-radio.ru/uploads/images/2025/01/de81ae3b28f5af517d2c65e947ae807e.png http://forum.rcl-radio.ru/uploads/images/2025/01/6ec4f6044485c624d5dc555085646bb5.png

139

Re: attiny13

byte a0 = temp/100;
if(a0==0){a0=19;}

140

Re: attiny13

Во теперь ОК,СПАСИБО!!!!!!!http://forum.rcl-radio.ru/uploads/images/2025/01/72436eac6e045067f1f9adae165686bb.png

141 (2025-02-17 07:54:49 отредактировано klause)

Re: attiny13

В интернете нашёл суточный таймер mini-tini.
"Устройство способно точно по заданному ранее времени один раз в сутки,  включить и отключить электрическое устройство.
Настройка времени включения и отключения исполнительного устройства, происходит так:
В течении суток в нужное нам время включения, нужно однократно нажать Кн1. (если нужно чтобы в течении суток устройство включалось только на 1 минуту, больше ничего делать не нужно, ровно через сутки в это-же время таймер будет включен на 1 минуту...., но это если кому нужно 1 минута."

Сделал я чуть лучше. Время можно установить фиксированное в программе. 0.0 - 1минута. До значения 23.58. (23.59. таймер не отключится). L1 моргнёт при нажатии Кн1 и будет гореть постоянно.

Если необходимо по текущему времени установить отключения таймера, то  надо кратковременно нажать Кн2. При этом будет мигающий светодиод L1 с частотой 1Гц.
Кнопки Кн1 и  Кн2 взаимно блокируются.

#include <EEPROM.h>
#define SDA  PB4
#define SCL  PB3

unsigned char hour,min,ch;
byte flag,t1,t2;
int main(void) {
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);
  pinMode(2, OUTPUT);
  ch = ds_read(0); // первый запуск ds1307
 if(ch==128)ds_write(0x00,0); 
  

while(1) {
    read_time(); // считываем текущее время 
     
    if (digitalRead(1) == 0&&flag==0) //start кнопка включения
        { 
        set_time(0,0,0);// обнуление начало счёта
       flag=1; 
       EEPROM.update(0,17); // установка часов отключения 0-23 
       EEPROM.update(1,59); // установка минут отключения 0-59 
       EEPROM.update(2,1); // обновление статуса кнопок
       for(byte i=0;i<3;i++){ // мигаем 
       ds_write(0x07,128); //OFF L1
       delay(100); 
       ds_write(0x07,0);  //ON L1
       delay(100);}
        }
    if (digitalRead(0) == 0&&flag==1) // кнопка отключения
        {
         flag=0;      
        EEPROM.update(0,hour); //установка отключения по часам реального времени 0-23
        EEPROM.update(1,min); //установка отключения по минутам реального времени 0-59
        EEPROM.update(2,0);
         ds_write(0x07,0b00010000);  //flash L1             
        }  
 if(hour<=t1&&min<=t2) digitalWrite(2,HIGH); // включаем реле
 else digitalWrite(2,LOW);

     flag=EEPROM.read(2); //ячейка памяти статуса кнопок
     t1=EEPROM.read(0); //ячейка памяти часов отключения
     t2=EEPROM.read(1); //ячейка памяти минут отключения

 delay(100);
}}
bool i2c_read_bit() {
    bool i2c_bit = 1;        
    DDRB &= ~(1 << SDA);            
    delayMicroseconds(10); 
    DDRB &= ~(1 << SCL);                
    if((PINB >> SDA) & 1) i2c_bit=0;                            
    delayMicroseconds(10);  
    DDRB |= (1 << SCL);              
    return i2c_bit;  
}
 
byte i2c_write_byte(byte data){
    for (byte i=0; i<8; i++){i2c_write_bit((data&0x80)==0);data<<=1;}    
    return i2c_read_bit(); 
}
 
byte i2c_read_byte(byte a){
    byte i, data=0;                
    for(i=0; i<8; i++){if (!i2c_read_bit()) data++;if(i!=7) data<<=1;}        
    i2c_write_bit(a);return data;  
}
 
void i2c_write_bit(byte b){
    delayMicroseconds(5);
    if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);}
    delayMicroseconds(5);
    DDRB &= ~(1 << SCL);       
    delayMicroseconds(10);
    DDRB |= (1 << SCL);
}
 
void i2c_start(){
     delayMicroseconds(10);  
     DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL); 
     delayMicroseconds(10); 
     DDRB |= (1 << SDA);  PORTB &= ~(1 << SDA);
     delayMicroseconds(10); 
     DDRB |= (1 << SCL);  PORTB &= ~(1 << SCL);   
     delayMicroseconds(10);
}
 
void i2c_stop()  {
     DDRB |= (1 << SDA);            
     delayMicroseconds(10);
     DDRB &= ~(1 << SCL);               
     delayMicroseconds(10); 
     DDRB &= ~(1 << SDA);             
}
 
byte ds_read(byte reg){
     byte data = 0;
     i2c_start();
     i2c_write_byte(0b11010000);
     i2c_write_byte(reg);
     i2c_start(); 
     i2c_write_byte(0b11010001); 
     data = i2c_read_byte(0);
     i2c_stop();
     return data;
  }
 
void ds_write(byte reg, byte data){
     i2c_start();
     i2c_write_byte(0b11010000);
     i2c_write_byte(reg);
     i2c_write_byte(data);
     i2c_stop();
  }  
 
void set_time(byte hours ,byte minute, byte second){
    ds_write(0x00,(second/10<<4)+second%10);
    ds_write(0x01,(minute/10<<4)+minute%10);
    ds_write(0x02,(hours/10<<4)+hours%10);

  }
void read_time(){  
min =  (ds_read(1) & 0x0F) + (((ds_read(1) & 0x70) >> 4) * 10);
hour = (ds_read(2) & 0x0F) + (((ds_read(2) & 0x70) >> 4) * 10);
     
  } 

http://forum.rcl-radio.ru/uploads/images/2025/02/dafab7e0664cbdfa118175fa4a9449a8.gif