Program oświetlenia schodów - wygaszanie czasowe.

0

Witam. Od razu zaznaczam, że nie jestem jakimś profesjonalistą w programowaniu, język C znam bardzo słabo - zdołałem jednak coś naskrobać, by moje oświetlenie schodów zapalało się i gasiło jak należy(zapalanie i gaszenie realizuję za pomocą czujników ruchu). Jednak mam problem z napisaniem funkcji, która wykona mi wygaszenie oświetlenia led, po jakimś czasie (przykładowo 30 sekundach) bezczynności, gdy przypadkowo schody się zapalą. Poniżej wstawiam napisany przeze mnie program.

//OPIS NA KOŃCU
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    //Port B i D jako wyjścia
    DDRB = 0XFF;
    DDRD = 0XFF;
    //Stan niski na wyjściach
    PORTB = 0X00;
    PORTD = 0X00;
    //Port C  jako wejścia
    DDRC = 0x00;
    //wejścia podciągnięte do GND (PRZYCISK TEST "PC5" DO VCC!)
    PORTC = 0x20;
    //inicjowanie zmiennych ustalających opóźnienie czasowe
    int a;
    int b;
    int c;
    a = 250;
    b = 1000;
    c = 350;
    //Początek nieskończonej pętli
    while (1) {
        // jeżeli na PINC3 padany zostanie stan wysoki
        if (PINC & 0X08) {
            _delay_ms(0);
            if (PORTB == 0) // jeżeli schody wygaszone, świeć
            {
                //sekwencja zapalania schodów od punktu A do punktu B
                PORTB = 0X01;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0X03;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0X07;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0X0F;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0X1F;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0X3F;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0X7F;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X00;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X01;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X03;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X07;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X0F;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X1F;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X3F;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0X7F;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0XFF;
                _delay_ms(1000);
            }
            else //jeżeli schody zapalone, gaś
            {
                //sekwencja wygaszania schodów od punktu B do punktu A
                _delay_ms(5000);
                PORTB = 0XFF;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X7F;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X3F;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X1F;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X0F;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X07;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X03;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X01;
                _delay_ms(c);
                PORTB = 0XFF;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X7F;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X3F;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X1F;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X0F;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X07;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X03;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X01;
                PORTD = 0X00;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0X00;
                _delay_ms(1000);
            }
        }

        if (PINC & 0X10) //Jeżeli na PINC4 podany zostanie stany wysoki
        {
            _delay_ms(0);
            if (PORTB == 0) //Jeżeli schody wygaszone, świeć
            {
                //sekwencja świecenia schodów od punktu B do punktu A
                PORTB = 0X00;
                PORTD = 0X80;
                _delay_ms(a);
                PORTB = 0X00;
                PORTD = 0XC0;
                _delay_ms(a);
                PORTB = 0X00;
                PORTD = 0XE0;
                _delay_ms(a);
                PORTB = 0X00;
                PORTD = 0XF0;
                _delay_ms(a);
                PORTB = 0X00;
                PORTD = 0XF8;
                _delay_ms(a);
                PORTB = 0X00;
                PORTD = 0XFC;
                _delay_ms(a);
                PORTB = 0X00;
                PORTD = 0XFE;
                _delay_ms(a);
                PORTB = 0X00;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0X80;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0XC0;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0XE0;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0XF0;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0XF8;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0XFC;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0XFE;
                PORTD = 0XFF;
                _delay_ms(a);
                PORTB = 0XFF;
                PORTD = 0XFF;
                _delay_ms(1000);
            }
            else //jeżeli schody zapalone, gaś
            {
                //sekwencja gaszenia schodów od punktu A do punktu B
                _delay_ms(5000);
                PORTB = 0XFE;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0XFC;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0XF8;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0XF0;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0XE0;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0XC0;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0X80;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0XFF;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0XFE;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0XFC;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0XF8;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0XF0;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0XE0;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0XC0;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0X80;
                _delay_ms(c);
                PORTB = 0X00;
                PORTD = 0X00;
                _delay_ms(1000);
            }
        }

        //program testujący (Przycisk TEST)

        if (!(PINC & 0X20)) //jeżli podany zostanie stan niski na PINC5
        {
            //sekwencja zapalania od punktu A do B
            _delay_ms(100);
            PORTB = 0X01;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0X03;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0X07;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0X0F;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0X1F;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0X3F;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0X7F;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X00;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X01;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X03;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X07;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X0F;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X1F;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X3F;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0X7F;
            _delay_ms(a);
            PORTB = 0XFF;
            PORTD = 0XFF; //wszystkie schody swiecą
            //sekwencja wygaszania od punktu A do B
            _delay_ms(a);
            PORTB = 0XFE;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0XFC;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0XF8;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0XF0;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0XE0;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0XC0;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0X80;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0XFF;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0XFE;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0XFC;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0XF8;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0XF0;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0XE0;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0XC0;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0X80;
            _delay_ms(a);
            PORTB = 0X00;
            PORTD = 0X00;
            //wszystkie wygaszone
            //pojedyncze zapalanie tam i z powrotem
            _delay_ms(b);
            PORTB = 0X01;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X02;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X04;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X08;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X10;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X20;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X40;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X80;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X01;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X02;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X04;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X08;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X10;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X20;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X40;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X80;
            _delay_ms(b);
            PORTB = 0X80;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X40;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X20;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X10;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X08;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X04;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X02;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X01;
            PORTD = 0X00;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X80;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X40;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X20;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X10;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X08;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X04;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X02;
            _delay_ms(b);
            PORTB = 0X00;
            PORTD = 0X00;
            _delay_ms(b);
        }
    }
}

Format! Style:

C++ online code formatter © 2014 by KrzaQ

Powered by vibe.d, the D language and clang-format 

@Edit Wszystko teraz poprawione, przepraszam. Po prostu nie wklejałem napisanego programu testującego - teraz jest całość od początku do końca.

Co do tych magicznych liczb, to chodzi Ci o przykładowo: PORTD = 0x02? Jest to zapis szesnastkowy. Wywołuje stan wysoki na PD1, czyli zapalenie danego stopnia.

1

Nie zajmuję się programowaniem na AVR ani nic podobnego, więc moje porady będą ciut ogólne.

  1. czy na pewno wkleiłeś cały kod? Brakuje kończących } lub większej ilości kodu
  2. potrzeba więcej informacji - czym są te magiczne liczby, których używasz na portach B i D?
  3. kod by zdecydowanie zyskał na czytelności gdybyś wydzielił funkcjonalności do funkcji
  4. te długie ciągi
                 PORTB = MAGIC_NUMBER;
                 PORTD = MAGIC_NUMBER;
                 _delay_ms(c);

prawie na pewno można zamienić na pętlę działającą na jakiejś tablicy par bez żadnej szkody dla wydajności.
5. użyj http://format.krzaq.cc do formatowania kodu. Nawet jeśli dla Ciebie to bez znaczenia, to nie jest tak dla innych ludzi czytających ten kod, a to od nich oczekujesz pomocy.

0

Wbrew pozorom to niełatwe zadanie, więc proszę o ocenę tego co sam tutaj przedstawiam, jednak nie rozumiem po co się tak męczyć:

// Arduino Uno R3, ATmega 328P-PU

#define SENSOR1_PIN A0
#define SENSOR2_PIN A1
#define LED_PIN 13
#define LED_ON_TIME 60
int sensor1_value;
int sensor2_value;
int seconds = 0;
int led_state = LOW;

void setup() 
{
    pinMode(LED_PIN, OUTPUT);   
}

void loop() 
{
    sensor1_value = digitalRead(SENSOR1_PIN);  
    sensor2_value = digitalRead(SENSOR2_PIN);

    if ((sensor1_value == HIGH) && (sensor2_value != HIGH))
    {
        if (led_state == LOW)
        {
            digitalWrite(LED_PIN, HIGH);
            led_state = HIGH;
        }
        else
        {
            digitalWrite(LED_PIN, LOW);
            led_state = LOW;
        }
        seconds = 0;
    }
    if ((sensor2_value == HIGH) && (sensor1_value != HIGH))
    {
        if (led_state == HIGH)
        {
            digitalWrite(LED_PIN, LOW);
            led_state = LOW;
        }
        else
        {
            digitalWrite(LED_PIN, HIGH);
            led_state = HIGH;
        }
        seconds = 0;
    }
    
    delay(1000); 
    if (led_state == HIGH)
    {
        seconds++;        
        if (seconds == LED_ON_TIME)
        {
            seconds = 0;
            digitalWrite(LED_PIN, LOW);
            led_state = LOW;
        }
    }
}

Standardowo pod ATmega 328P-PU albo Arduino, choć do tak prostych zastosowań to wystarczy ATtiny45/85, który ma 8 nóżek ale pin-y muszą być inne. Zakładam tutaj że włączenie następuje stanem HIGH (5V) na A0 z pierwszego czujnika i na A1 z drugiego czujnika, odczyt digitalRead bo tak też można a nie analogRead. No ale jak to usprawnić kiedy ktoś się będzie bawił, bo tutaj czujnik który na dole włączy oświetlenie, jednocześnie je zaraz wyłączy kiedy to zostanie znowu wyzwolony. Tzn. założyłem tak żeby czujnik na dole i na górze mógł włączać albo wyłączać oświetlenie w zależności od tego czy się świeci czy nie.

Oczywiście można wykorzystać EEPROM do zapisu ustawień na jaki czas ma się świecić, tutaj jest minuta. Zakładam tu że jednocześnie dwa aktywowane czujniki nie wyzwalają układu. Co o tym sądzicie?

1

@drorat1:
1.Ki czego zmienne globalne?
2.

        if (led_state == LOW)
        {
            digitalWrite(LED_PIN, HIGH);
            led_state = HIGH;
        }
        else
        {
            digitalWrite(LED_PIN, LOW);
            led_state = LOW;
        }

Użyj operatora !, a nie się bawisz w ify:

led_state = !led_state;
digitalWrite(LED_PIN, led_state);

3.LED_ON_TIME zupełnie nie mówi, co ta stała wyraża.

0

Posiadam ATMEGA8, na niej zrealizowany mam cały układ. Schodów jest 16 - czy ten program, co został napisany wyżej będzie działał prawidłowo?

0

No nie wiem czy tak do końca, założyłem tutaj dwa czujniki ruchu, jeden na dole, drugi na górze, każdy z nich może włączać albo wyłączać oświetlenie. Tzn. zakładam że gdy jest zgaszone, to np. jeden z czujników (obojętnie czy na dole czy na górze) załączy oświetlenie, kiedy osoba przejdzie do drugiego, oświetlenie zostanie wyłączone. Wydaje mi się że należałoby zrezygnować tutaj z opcji wyłączania oświetlenia za pomocą czujnika a więc czujnik powinien tylko załączać oświetlenie a ono powinno gasnąć po ustalonym czasie, wówczas nie byłoby problemu. Zakładam minutę na przejście schodami. Mam Arduino Uno i sprawdzałem na podłączonej diodzie pod PIN 13.

// Arduino Uno R3, ATmega 328P-PU

#define SENSOR1_PIN A0
#define SENSOR2_PIN A1
#define LED_PIN 13
#define LED_TIMEOUT 60
int sensor1_value;
int sensor2_value;
int seconds = 0;
int led_state = LOW;

void setup() 
{
    pinMode(LED_PIN, OUTPUT);   
}

void loop() 
{
    sensor1_value = digitalRead(SENSOR1_PIN);  
    sensor2_value = digitalRead(SENSOR2_PIN);

    if ((sensor1_value == HIGH) || (sensor2_value == HIGH))
    {
        digitalWrite(LED_PIN, HIGH);
        led_state = HIGH;
        seconds = 0;
    }
    
    delay(1000); 
    if (led_state == HIGH)
    {
        seconds++;        
        if (seconds == LED_TIMEOUT)
        {
            seconds = 0;
            digitalWrite(LED_PIN, LOW);
            led_state = LOW;
        }
    }
}

Ala Arduino Uno / ATMEGA 328 (32kb FLASH, 2kb RAM, 1kb EEPROM):

Szkic używa 1 228 bajtów z (3%) pamięci programu. Maksimum to 32 256 bajtów.
Globalne zmienne używają 17 bajtów z (0%) dynamicznej pamięci, pozostawiając 2 031 bajtów dla lokalnych zmiennch. Maksimum to  2 048 bajtów.
0
drorat1 napisał(a):

No nie wiem czy tak do końca, założyłem tutaj dwa czujniki ruchu, jeden na dole, drugi na górze, każdy z nich może włączać albo wyłączać oświetlenie. Tzn. zakładam że gdy jest zgaszone, to np. jeden z czujników (obojętnie czy na dole czy na górze) załączy oświetlenie, kiedy osoba przejdzie do drugiego, oświetlenie zostanie wyłączone. Wydaje mi się że należałoby zrezygnować tutaj z opcji wyłączania oświetlenia za pomocą czujnika a więc czujnik powinien tylko załączać oświetlenie a ono powinno gasnąć po ustalonym czasie, wówczas nie byłoby problemu. Zakładam minutę na przejście schodami. Mam Arduino Uno i sprawdzałem na podłączonej diodzie pod PIN 13.

// Arduino Uno R3, ATmega 328P-PU

#define SENSOR1_PIN A0
#define SENSOR2_PIN A1
#define LED_PIN 13
#define LED_TIMEOUT 60
int sensor1_value;
int sensor2_value;
int seconds = 0;
int led_state = LOW;

void setup() 
{
    pinMode(LED_PIN, OUTPUT);   
}

void loop() 
{
    sensor1_value = digitalRead(SENSOR1_PIN);  
    sensor2_value = digitalRead(SENSOR2_PIN);

    if ((sensor1_value == HIGH) || (sensor2_value == HIGH))
    {
        digitalWrite(LED_PIN, HIGH);
        led_state = HIGH;
        seconds = 0;
    }
    
    delay(1000); 
    if (led_state == HIGH)
    {
        seconds++;        
        if (seconds == LED_TIMEOUT)
        {
            seconds = 0;
            digitalWrite(LED_PIN, LOW);
            led_state = LOW;
        }
    }
}

Ala Arduino Uno / ATMEGA 328 (32kb FLASH, 2kb RAM, 1kb EEPROM):

Szkic używa 1 228 bajtów z (3%) pamięci programu. Maksimum to 32 256 bajtów.
Globalne zmienne używają 17 bajtów z (0%) dynamicznej pamięci, pozostawiając 2 031 bajtów dla lokalnych zmiennch. Maksimum to  2 048 bajtów.

Tylko, że ja nie mogę zrezygnować z jednej czujki, ponieważ wszystko już mam zamontowane :D Poza tym, nie wiem, czy dobrze się zrozumieliśmy, być może przez to, że dokładnie nie opisałem jak działa moje oświetlenie itp.
Otóż, mam oświetlenie na 16 stopni oraz dwa czujniki ruchu - jeden na górze, drugi na dole. Gdy czujnik na dole wykryje ruch, schody po kolei, z 250ms opóźnieniem zapalają się w kierunku góry. Gdy już wejdę na górę i czujka na górze wykryje moją obecność, rozpoczyna się sekwencja gaszenia stopni, po kolei, od 1 do 16 stopnia. Sytuacja analogicznie odwrotnie występuje gdy schodzę i czujka na górze mnie wykrywa - zapalają się po kolei schody od 16 do 1, gaszenie następuje tak samo.
Rozmyślam po prostu, jak wkomponować w ten program wygaszenie wszystkich schodów po określonym czasie, gdy przypadkowo jakaś czujka samoczynnie się załączy, powodując ich zapalenie (czasami się tak zdarza).

0

Dlatego najpierw się robi prototypy na płytkach stykowych, używając diód i od biedy mikroswitche zamiast czujników albo same czujniki, no chyba że masz duże doświadczenie w elektronice i możesz montować sobie układ od razu :-)

Nie znam układu, nie wiem jak jest podłączone oświetlenie, można każdą diodę dać na cyfrowe wyjście ale tutaj jest problem ile wyjść ma procesor, można też użyć dodatkowych scalaków żeby używać tylko czterech a nie 16 wyjść a nawet jednego (używając wyjścia PWM).

Usiłowałem tylko dać do zrozumienia że programowanie w oparciu o Arduino IDE powinno być prostsze, kompletnie nie rozumiem co się dzieje w kodzie który Ty przedstawiłeś ale to może dlatego że nie programuję uP w ten sposób ale w taki jak sam podałem :-)

Sprawa tu też nie jest taka prosta, dajesz jak chcesz żeby kolejne diody czy tam żarówki zapalały się co 250 ms, to sprawdzasz to w pętli, tylko że delay(250) to też raczej nie wygląda mi na dobry pomysł, bo czujnik na górze musi czekać a co jeśli wbiegniesz po schodach zanim się wszystkie diody zapalą? I czujka na górze choć wyśle sygnał to i tak uP nie przyjmie nawet sygnału bo musi skończyć robotę z zapaleniem diód. Można tu dać delay 1 ms i sprawdzanie licznika modulo 250 i dalej kolejnych zmiennych (stany czy diody są zapalone) i na tej podstawie zapalanie (i gaszenie) kolejnego oświetlenia. Jest tu jeszcze kwestia ustawień, tak żeby w razie czego nie przeprogramowywać od nowa, więc po to masz EEPROM żeby zapisywać tam opóźnienia i inne rzeczy.

Nikt tu nie przedstawi gotowca a sprawa nawet na Arduino IDE wcale nie jest taka prosta jakby się wydawało, program Ci może urosnąć do takiego rozmiaru że sama pamięć ATmega8 nie wystarczy i co wtedy zrobisz jak już masz zmontowany układ?

0
drorat1 napisał(a):

Dlatego najpierw się robi prototypy na płytkach stykowych, używając diód i od biedy mikroswitche zamiast czujników albo same czujniki, no chyba że masz duże doświadczenie w elektronice i możesz montować sobie układ od razu :-)

Nie znam układu, nie wiem jak jest podłączone oświetlenie, można każdą diodę dać na cyfrowe wyjście ale tutaj jest problem ile wyjść ma procesor, można też użyć dodatkowych scalaków żeby używać tylko czterech a nie 16 wyjść a nawet jednego (używając wyjścia PWM).

Usiłowałem tylko dać do zrozumienia że programowanie w oparciu o Arduino IDE powinno być prostsze, kompletnie nie rozumiem co się dzieje w kodzie który Ty przedstawiłeś ale to może dlatego że nie programuję uP w ten sposób ale w taki jak sam podałem :-)

Sprawa tu też nie jest taka prosta, dajesz jak chcesz żeby kolejne diody czy tam żarówki zapalały się co 250 ms, to sprawdzasz to w pętli, tylko że delay(250) to też raczej nie wygląda mi na dobry pomysł, bo czujnik na górze musi czekać a co jeśli wbiegniesz po schodach zanim się wszystkie diody zapalą? I czujka na górze choć wyśle sygnał to i tak uP nie przyjmie nawet sygnału bo musi skończyć robotę z zapaleniem diód. Można tu dać delay 1 ms i sprawdzanie licznika modulo 250 i dalej kolejnych zmiennych (stany czy diody są zapalone) i na tej podstawie zapalanie (i gaszenie) kolejnego oświetlenia. Jest tu jeszcze kwestia ustawień, tak żeby w razie czego nie przeprogramowywać od nowa, więc po to masz EEPROM żeby zapisywać tam opóźnienia i inne rzeczy.

Nikt tu nie przedstawi gotowca a sprawa nawet na Arduino IDE wcale nie jest taka prosta jakby się wydawało, program Ci może urosnąć do takiego rozmiaru że sama pamięć ATmega8 nie wystarczy i co wtedy zrobisz jak już masz zmontowany układ?

Co zrobię? Po prostu odpuszczę ten pomysł. Generalnie wszystko działa jak należy, po prostu chciałem wprowadzić takie udogodnienie, czyli wyłączanie po czasie, bo szkoda tracić prąd na palenie się przykładowo w nocy. Tak myślałem, że to nie jest takie proste, jakby mogło się wydawać, szkoda :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1