25-07-2022, 19:51
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.
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ą.