Показать сообщение отдельно
Старый 13.09.2021, 22:54   #31
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 3,073
Сказал(а) 'не согласен(а)'!: 4
Сказали 'не согласен'! 29 раз(а) в 19 сообщениях
Сказал(а) спасибо: 1,733
Поблагодарили 1,664 раз(а) в 841 сообщениях
Репутация: обеспечил(а) себе прекрасное будущее (1699)
По умолчанию

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
int*bootrandom*__attribute__*((section*(".noinit") ));
проверил на тини, работает!

при этом, если после запуска не перезаписывать bootrandom случайным числом, то разнообразия в состоянии 4 диодов больше, чем при перезаписи, понятно что это призрачные умозаключения на основе малого количества испытаний, но тем не менее.

итак готовый скетч, не использующий чтение с ножки (но имеющий такую возможность)
Скрытый текст
Arduino код:
// ATtiny13 LED blinker
// Copyright (c) 2021 Aleksandr.ru
// @see http://aleksandr.ru

// #define RANDOM_PIN A0 // reset pin
#define LED1_PIN PB0
#define LED2_PIN PB1
#define LED3_PIN PB2
#define LED4_PIN PB4
#define MODE_PIN PB3

#define MAX_LAMP 4
#define MAX_MINUTES 60
#define LONG_DELAY 60
#define SHORT_DELAY 15

struct Lamp
{
    
uint8_t pin;
    
uint8_t minute;
    
boolean state;
};

Lamp lamps [] = {
    {
LED1_PIN0false},
    {
LED2_PIN0false},
    {
LED3_PIN0false},
    {
LED4_PIN0false}
};

uint8_t old_minute MAX_MINUTES;

#ifndef RANDOM_PIN
uint32_t bootrandom __attribute__ ((section (".noinit")));
#endif

void setup() 
{
    
#ifdef RANDOM_PIN
    
uint16_t bootrandom analogRead(RANDOM_PIN);
    
#endif
    
    
randomSeed(bootrandom);
    
    
pinMode(MODE_PININPUT_PULLUP);

    for (
uint8_t i 0MAX_LAMPi++) {
        
pinMode(lamps[i].pinOUTPUT);
        
lamps[i].state = !random(3); // 2/3 off     
    
}
}

void loop() 
{
    
// uint8_t minute = (millis() / 1000) % MAX_MINUTES;
    
uint8_t minute = (millis() / 1000 60) % MAX_MINUTES;
 
    if (
minute != old_minute) {
        
old_minute minute;

        for (
uint8_t i 0MAX_LAMPi++) {
            if (
lamps[i].minute == minute) {
                
change(lamps[i]);
            }
        }
    }
}

void change(Lamp &lamp)
{
    
lamp.state = !lamp.state;
    
digitalWrite(lamp.pinlamp.state HIGH LOW);
    
uint8_t max_delay = !digitalRead(MODE_PIN) ? LONG_DELAY SHORT_DELAY;    
    
uint8_t new_delay random(1max_delay);
    if (!
lamp.statenew_delay new_delay 2// short off interval
    
if (!new_delaynew_delay 1;
    
lamp.minute += new_delay;
    if (
lamp.minute >= MAX_MINUTESlamp.minute -= MAX_MINUTES;

__________________
🎉 мой канал в телеграм @aleksandr_ru_blog

Последний раз редактировалось Rebel; 16.09.2021 в 00:22.
Rebel вне форума   Вверх