• 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
#1
Witam jest osoba poczatkujący i chciałbym prosić o pomoc . Chciałem zrobić oświetlenie schodów z użyciem dwóch czujników PIR .Schody sie oświecają i gasną w dobrej kolejności lecz cały czas oświecają sie i gasną i taka pętla a to miało sie włączać przy użyciu czujników PIR.
 
Odpowiedź
#2
kod podaj
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Kod:
void setup () {
  pinMode(36,OUTPUT);stopień 1z2
  pinMode(37,OUTPUT);stopień 3
  pinMode(38,OUTPUT);stopień 4
  pinMode(39,OUTPUT);stopień 5
  pinMode(40,OUTPUT);stopień 6
  pinMode(41,OUTPUT);stopień 7
  pinMode(41,OUTPUT);stopień 8
  pinMode(42,OUTPUT);stopień 9
  pinMode(43,OUTPUT);stopień 10
  pinMode(44,OUTPUT);stopień 11
  pinMode(45,OUTPUT);stopień 12
  pinMode(46,OUTPUT);stopień 13
  pinMode(47,OUTPUT);stopień 14
  pinMode(48,OUTPUT);stopień 15
  pinMode(49,OUTPUT);stopień 16
  pinMode(50,OUTPUT);stopień 17
  pinMode(51,OUTPUT);stopień 18


  pinMode(22,INPUT_PULLUP);czujnik doł
  pinMode(24,INPUT_PULLUP);czujnik góra
}

void loop()  {



  if (digitalRead(22) == HIGH){
    digitalWrite(36, LOW); //Włacz diodę
    Serial.print("diody wlaczone 22");
    delay(500);
    digitalWrite(37,LOW);Włącz diodę
    delay(500);
    digitalWrite(38,LOW);Włącz diodę
    delay(500);
    digitalWrite(39,LOW);Włącz diodę
    delay(500);
    digitalWrite(40,LOW);Włącz diodę
    delay(500);
    digitalWrite(41,LOW);Włącz diodę
    delay(500);
    digitalWrite(42,LOW);Włącz diodę
    delay(500);
    digitalWrite(43,LOW);Włącz diodę
    delay(500);
    digitalWrite(44,LOW);Włącz diodę
    delay(500);
    digitalWrite(45,LOW);Włącz diodę
    delay(500);
    digitalWrite(46,LOW);Włącz diodę
    delay(500);
    digitalWrite(47,LOW);Włącz diodę
    delay(500);
    digitalWrite(48,LOW);Włącz diodę
    delay(500);
    digitalWrite(49,LOW);Włącz diodę
    delay(500);
    digitalWrite(50,LOW);Włącz diodę
    delay(500);
    digitalWrite(51,LOW);Włącz diodę
    delay(10000); Czeka 10s
    Serial.print("diody wyłaczone 22");
    digitalWrite(36,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(37,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(38,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(39,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(40,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(41,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(42,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(43,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(44,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(45,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(46,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(47,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(48,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(49,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(50,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(51,HIGH);Wyłącz diodę
    delay(400);
  }

if (digitalRead(24) == HIGH){
    digitalWrite(36, LOW); //Włacz diodę
    Serial.print("diody wlaczone 24");
    delay(500);
    digitalWrite(37,LOW);Włącz diodę
    delay(500);
    digitalWrite(38,LOW);Włącz diodę
    delay(500);
    digitalWrite(39,LOW);Włącz diodę
    delay(500);
    digitalWrite(40,LOW);Włącz diodę
    delay(500);
    digitalWrite(41,LOW);Włącz diodę
    delay(500);
    digitalWrite(42,LOW);Włącz diodę
    delay(500);
    digitalWrite(43,LOW);Włącz diodę
    delay(500);
    digitalWrite(44,LOW);Włącz diodę
    delay(500);
    digitalWrite(45,LOW);Włącz diodę
    delay(500);
    digitalWrite(46,LOW);Włącz diodę
    delay(500);
    digitalWrite(47,LOW);Włącz diodę
    delay(500);
    digitalWrite(48,LOW);Włącz diodę
    delay(500);
    digitalWrite(49,LOW);Włącz diodę
    delay(500);
    digitalWrite(50,LOW);Włącz diodę
    delay(500);
    digitalWrite(51,LOW);Włącz diodę
    delay(10000); Czeka 10s
    Serial.print("diody wyłaczone 24");
    digitalWrite(36,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(37,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(38,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(39,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(40,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(41,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(42,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(43,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(44,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(45,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(46,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(47,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(48,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(49,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(50,HIGH);Wyłącz diodę
    delay(400);
    digitalWrite(51,HIGH);Wyłącz diodę
    delay(400);
  }
 
Odpowiedź
#4
Wszystko zależy co jest na sygnałowym PIR, niestety tego nie wiem i ciężko powiedzieć ale na pewno masz błędy

if (digitalRead(22) == HIGH)

i tu

if (digitalRead(24) == HIGH)


Skoro cały czas działa to znaczy że na tych pniach ciągle jest sygnał HIGH czyli czujnik w stanie niewykrycia nie ściąga do masy na LOW..


Z drugiej strony czemu nie korzystasz z "for" skoro wyjścia są w kolejności. Kod by był bardzo mały i bardziej czytelny.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
Z tego co widzę z wersją ,,for,, by było lepsze ale niestety musiał bym mieć pomoc do napisania
 
Odpowiedź
#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ź
#7
Zdjęcia podłączenia


Załączone pliki Miniatury
       
 
Odpowiedź
#8
Daj rezystory 10kOhm do masy piny 22,24 sygnałowe z PIR przez rezystor do masy. Zrób tak zwany "pulldown" nie mam tego czujnika a nie widzę dokumentacji schematu czy ma w sobie ten rezystor.

https://forbot.pl/blog/leksykon/rezystor...-pull-down

A jak nadal nie gaśnie to zrób test odłączając sygnałowy z PIR może jest źle wyregulowany.

Z drugiej strony pamiętaj że PIR ma dwa potencjometry jeden do ustawiania czułości drugi do ustawiania czasu wysokiego stanu. A ze pisałeś tak program że ma czekać 10s to musisz uwzględnić czas stanu wysokiego PIR plus te 10s. Ale widzę że zworka na L wiec to odpada.

W drugim PIR zworka też na L?
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#9
Tak druga zworka na L ,dziś przetestuje z rezystorem
 
Odpowiedź
#10
Chciało ci się tyle pisać ?  Angel Nie wiem czy nie ma literowek, bo nie sprawdzalem, ale mozna w tyle linijek to zrobic
Kod:
const int FIRST_PIN = 36;
const int LAST_PIN  = 51;

void setup
{
    for(int i = FIRST_PIN; i <= LAST_PIN; i++) pinMode(i,OUTPUT);
    pinMode(22,INPUT_PULLUP);czujnik doł
      pinMode(24,INPUT_PULLUP);czujnik góra
}


void loop
{
        if (digitalRead(22) == HIGH) MojeSchody(FIRST_PIN, LAST_PIN, 500, 400);
        if (digitalRead(24) == HIGH) MojeSchody(FIRST_PIN, LAST_PIN, 500, 400):   
}

void MojeSchody(int Poczatek, int Koniec, int Opoznienie1, int Opoznienie2)
{
        for(int i = Poczatek; i <= Koniec; i++)
        {
            digitalWrite(i, LOW);
            delay(Opoznienie1);
        }
        
        delay(Opoznienie1 * 20);
        
        for(int j = Poczatek; j <= Koniec; j++)
        {
            digitalWrite(i, HIGH);
            delay(Opoznienie2);            
        }
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości