• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino+ Moduł 16 przekaznikow+2x PIR
#6
Po pinach widzę że chyba atmega2560?? jak tak to ten kod będzie działał.

Proszę zastanów się nad tym co jak i dlaczego byś się troszku nauczył (nie ruszaj tylko rejestry timera), bez blokowania i efekty będą, jak ktoś wejdzie od dołu i od góry jednocześnie to zapali się sekwencja od dołu i góry i spotka się w środku. Tak samo wygaszanie jak w trakcie będzie wchodzić ktoś to przerwie wygaszanie i zapali od miejsca zgaszenia ale z opóźnionym czasem... 

Jakby jednak coś nie działało to pisz, coś mi nie pasi po co zrobiłeś przy PIR pullup. Skoro czujnik podnosi na HIGH powinieneś dać rezystor 10kOhm do masy czyli pulldown. 

Kod:
#include <Arduino.h>

uint8_t PIN_MIN = 36;
uint8_t PIN_MAX = 51;
uint8_t PIR_DOL = 22;
uint8_t PIR_GORA = 24;

uint8_t LED_DOL;
uint8_t LED_GORA;

bool Flag_ON_DOL = false;
bool Flag_OFF_DOL = false;
bool Flag_ON_GORA = false;
bool Flag_OFF_GORA = false;

bool Flag_DOL_10s =false;
bool Flag_GORA_10s =false;

volatile uint16_t TIK_DOL =0;
volatile uint16_t TIK_GORA =0;



ISR(TIMER1_COMPA_vect) { // przerwanie co 10ms

  TIK_DOL++;
  TIK_GORA++;

}

void setup() {

for(uint8_t x=PIN_MIN; x<=PIN_MAX; x++){
  pinMode(x,OUTPUT); //stopinie 1-18

}

pinMode(PIR_DOL,INPUT);  // czujnik doł
pinMode(PIR_GORA,INPUT); // czujnik góra

// Timer 10ms

  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 624;    // 100 Hz (16000000/((624+1)*256))
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12);
  TIMSK1 |= (1 << OCIE1A);
  sei();

}

void loop() {

  if(digitalRead(PIR_DOL)== HIGH){
    if(Flag_ON_DOL ==false){
      Flag_ON_DOL = true;
      LED_DOL = PIN_MIN;
    } 
  }

  if(digitalRead(PIR_GORA)== HIGH){
    if(Flag_ON_GORA ==false){
      Flag_ON_GORA = true;
      LED_GORA = PIN_MAX;
    }
  }

  if(Flag_ON_DOL && TIK_DOL >= 50){ // co 500ms
    digitalWrite(LED_DOL, LOW);
    LED_DOL++;
    TIK_DOL =0;

    if(LED_DOL == (PIN_MAX+1)){
      LED_DOL = PIN_MIN;
      Flag_ON_DOL =false;
      Flag_OFF_DOL =true;
      Flag_DOL_10s =false;
    }

  }else{
    if(Flag_DOL_10s){
      if(Flag_OFF_DOL && TIK_DOL >= 40){ // co 400ms
        digitalWrite(LED_DOL, HIGH);
        LED_DOL++;
        TIK_DOL =0;
        if(LED_DOL == (PIN_MAX+1)){
          Flag_OFF_DOL = false;
        }
      }
    }else{
      if(TIK_DOL >= 1000){  // czekaj 10s na wyłaczenie
        Flag_DOL_10s =true;
      } 
    }
  }

  if(Flag_ON_GORA && TIK_GORA >= 50){ // co 500ms
    digitalWrite(LED_GORA, LOW);
    LED_GORA--;
    TIK_GORA =0;

    if(LED_GORA == (PIN_MIN -1)){
      LED_GORA = PIN_MAX;
      Flag_ON_GORA =false;
      Flag_OFF_GORA =true;
      Flag_GORA_10s =false;
    }

  }else{
    if(Flag_GORA_10s){
    if(Flag_OFF_GORA && TIK_GORA >= 40){// co 400ms
      digitalWrite(LED_GORA, LOW);
      LED_GORA--;
      TIK_GORA =0;
      if(LED_GORA == (PIN_MAX -1)){
        Flag_OFF_GORA =false;
      }
    }
    }else{
      if(TIK_GORA >= 1000){  // czekaj 10s na wyłaczenie
        Flag_GORA_10s =true;
      }
    }
  }

}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Arduino+ Moduł 16 przekaznikow+2x PIR - przez Jarewa0606 - 25-07-2022, 19:51

Skocz do:


Przeglądający: 1 gości