Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Oświetlenie Led na czujniku Pir i przekazniku.
#1
Dostałem zadanie zrobienia oświetlenia na dwie, trzy listwy Led z czujnikiem ruchu i przekaźnikiem dla starszej osoby chodzącej o kulach. Zasilanie Led 12 V, przekaźnik 12v/5V. Przerobiłem program alarmu na oświetlenie. Program wygląda tak:

Arduino Uno
2 diody dwu kolorowe rg.
Przycisk
Czujnik Pir
Przekaźnik

Kod:
#include <Bounce2.h>

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
#define CZAS_SWIECENIA 1000 // Czas świecenia

Bounce bouncer = Bounce(PRZYCISK, 25);
boolean wlaczony = false;
unsigned long przycisk_czas, wlaczony_czas;

void setup() {
 
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(SWIATLO, OUTPUT);
digitalWrite(LED0, HIGH);

pinMode(PIR, INPUT);
pinMode(PRZYCISK, INPUT_PULLUP);
}

void zmiana()
{
digitalWrite(SWIATLO, LOW);
wlaczony_czas = millis() + CZAS_SWIECENIA;
przycisk_czas = millis() + 1000;
wlaczony = !wlaczony;
detachInterrupt(digitalPinToInterrupt(PRZYCISK));
}

void loop() {
 
digitalWrite(LED0, wlaczony);
digitalWrite(LED1, LOW);
if (przycisk_czas < millis())
  attachInterrupt(digitalPinToInterrupt(PRZYCISK), zmiana, FALLING);

if (digitalRead(PIR))
{
  if (wlaczony && wlaczony_czas < millis())
   
  digitalWrite(SWIATLO, HIGH);
}
else
  digitalWrite(SWIATLO, LOW);

}


Niby działa - czujnik przełącza przekaźnik czyli teraz diodę Led dwu kolorową ale czas świecenia jest krótki. Próbowałem regulacją na czujniku i to samo. Chcę aby świeciło się przynajmniej 5 minut od wykrycia ruchu. Czas liczony od nowa od wykrycia  ruchu po minucie od zaświecenia.
Jak nie chcesz odpowiedzieć to nie pisz !!!
Odpowiedz
#2
Ja bym spróbował zrobić to na timerze. Co pół sekundy sprawdza stan na czujniku w zależności czy czas pracy przekaźnika jest równy 0 czy jest pomiędzy 50 a 70 sekund (czyli to odświeżanie po minucie). Pisałem na sucho, ale myślę, że kod powinien działać. Musisz tylko dodać np. na osobnym timerze obsługę przycisku i diód led Uśmiech

Kod:
#include "Timer.h"

//dodajemy timer
Timer t;

//KONFIGURACJA PINOW
#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony

int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;

void setup() {

 pinMode(LED0, OUTPUT);
 pinMode(LED1, OUTPUT);
 pinMode(SWIATLO, OUTPUT);
 digitalWrite(LED0, HIGH);

 pinMode(PIR, INPUT);
 pinMode(PRZYCISK, INPUT_PULLUP);

 t.every(500, PIRCheck);  //co 500ms wykonywana jest metoda


}


void loop() {
 t.update();
}


void PIRCheck() {
 checkForMovement();
}

boolean checkForMovement() {
 if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
   if (digitalRead(PIR) == HIGH) { //wykryto ruch
     state = true;
   }
   else {
     state = false;
   }
 }

 if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
   if (digitalRead(PIR) == HIGH) { //wykryto ruch
     onTime = 0;
     state = true;
   }
 }

 lightControl(state);
 return state;
}


void lightControl(boolean isStateOn) {
 if (isStateOn) {
   if (onTime < CZAS_SWIECENIA) {
     digitalWrite(SWIATLO, HIGH);
     onTime++;
   }
 }
 else {
   digitalWrite(SWIATLO, LOW);
 }

 if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
   lightControl(checkForMovement());
 }

 if (onTime > CZAS_SWIECENIA) {
   onTime = 0;
 }


}


Timery to akurat fajna sprawa bo dzięki nim, np. mikrokontroler nie jest blokowany na 5 minut na załączaniu przekaźnika Uśmiech
>> Nie pomagam na PW. Od tego jest forum Uśmiech >> Koniecznie sprawdź: Jak dodawać załączniki

1 problem = 1 wątek
Odpowiedz
#3
(26-11-2017, 22:10)feriar napisał(a): Ja bym spróbował zrobić to na timerze. Co pół sekundy sprawdza stan na czujniku w zależności czy czas pracy przekaźnika jest równy 0 czy jest pomiędzy 50 a 70 sekund (czyli to odświeżanie po minucie). Pisałem na sucho, ale myślę, że kod powinien działać. Musisz tylko dodać np. na osobnym timerze obsługę przycisku i diód led Uśmiech

Kod:
#include "Timer.h"

//dodajemy timer
Timer t;

//KONFIGURACJA PINOW
#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony

int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;

void setup() {

 pinMode(LED0, OUTPUT);
 pinMode(LED1, OUTPUT);
 pinMode(SWIATLO, OUTPUT);
 digitalWrite(LED0, HIGH);

 pinMode(PIR, INPUT);
 pinMode(PRZYCISK, INPUT_PULLUP);

 t.every(500, PIRCheck);  //co 500ms wykonywana jest metoda


}


void loop() {
 t.update();
}


void PIRCheck() {
 checkForMovement();
}

boolean checkForMovement() {
 if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
   if (digitalRead(PIR) == HIGH) { //wykryto ruch
     state = true;
   }
   else {
     state = false;
   }
 }

 if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
   if (digitalRead(PIR) == HIGH) { //wykryto ruch
     onTime = 0;
     state = true;
   }
 }

 lightControl(state);
 return state;
}


void lightControl(boolean isStateOn) {
 if (isStateOn) {
   if (onTime < CZAS_SWIECENIA) {
     digitalWrite(SWIATLO, HIGH);
     onTime++;
   }
 }
 else {
   digitalWrite(SWIATLO, LOW);
 }

 if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
   lightControl(checkForMovement());
 }

 if (onTime > CZAS_SWIECENIA) {
   onTime = 0;
 }


}


Timery to akurat fajna sprawa bo dzięki nim, np. mikrokontroler nie jest blokowany na 5 minut na załączaniu przekaźnika Uśmiech
Spróbuję. Na razie doszedłem do czego są te dwa pokrętła na czujniku. Lewy - czas a prawy odległość. Znalazłem też że do czujnika PIR HC-SR501 można wlutować fotorezystor.


Załączone pliki Miniatury
   
Jak nie chcesz odpowiedzieć to nie pisz !!!
Odpowiedz
#4
Mam kłopot z przełącznikiem - nie wyłącza ani nie załącza. Po wgraniu ma się świecić czerwona i nie reagować na czujnik. Dopiero po załączeniu- dioda na zielono - ma reagować na czujnik. Teraz świeci na zielono. Chyba żebym do czujnika wlutował fotorezystor to wtedy ustawię w programie żeby jak się zrobi ciemniej reagował czujnik.  Cały czas załączone. Ile kosztuje Arduino Nano V 3.0?
Kod:
#include <Bounce2.h>
#include "Timer.h"

//dodajemy timer

Timer t;

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;

Bounce bouncer = Bounce(PRZYCISK, 25);
boolean wlaczony = false;
unsigned long przycisk_czas, wlaczony_czas;

void setup() {
 
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(SWIATLO, OUTPUT);
digitalWrite(LED0, HIGH);

pinMode(PIR, INPUT);
pinMode(PRZYCISK, INPUT_PULLUP);
t.every(500, PIRCheck);//co 500ms wykonywana jest metoda

}

void zmiana()
{
digitalWrite(SWIATLO, LOW);
wlaczony_czas = millis() + CZAS_SWIECENIA;
przycisk_czas = millis() + 1000;
wlaczony = !wlaczony;
detachInterrupt(digitalPinToInterrupt(PRZYCISK));
}

void loop() {
 t.update();
}


void PIRCheck() {
checkForMovement();
}

boolean checkForMovement() {
if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
if (digitalRead(PIR) == HIGH) { //wykryto ruch
state = true;
}
else {
state = false;
}
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
if (digitalRead(PIR) == HIGH) { //wykryto ruch
onTime = 0;
state = true;
}
}

lightControl(state);
return state;
}


void lightControl(boolean isStateOn) {
if (isStateOn) {
if (onTime < CZAS_SWIECENIA) {
digitalWrite(SWIATLO, HIGH);
onTime++;
}
}
else {
digitalWrite(SWIATLO, LOW);
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
 lightControl(checkForMovement());
}

if (onTime > CZAS_SWIECENIA) {
onTime = 0;
}
}
Jak nie chcesz odpowiedzieć to nie pisz !!!
Odpowiedz
#5
Cytat:Ile kosztuje Arduino Nano V 3.0?
Na Aliexpresie klon poniżej 2$. Wiem że na Gearbest czasami są promocje poniżej 1$. W Polsce powyżej 10zł (Allegro), tylko trzeba zwracać uwagę na czas realizacji przesyłki. Często zdarza się że ktoś zgarnia dodatkową kasę za nic, a zamówienie przychodzi z Chin po miesiącu.
Odpowiedz
#6
(26-11-2017, 23:57)Ronin napisał(a): Mam kłopot z przełącznikiem - nie wyłącza ani nie załącza. Po wgraniu ma się świecić czerwona i nie reagować na czujnik. Dopiero po załączeniu- dioda na zielono - ma reagować na czujnik. Teraz świeci na zielono. Chyba żebym do czujnika wlutował fotorezystor to wtedy ustawię w programie żeby jak się zrobi ciemniej reagował czujnik.  Cały czas załączone. Ile kosztuje Arduino Nano V 3.0?
Kod:
#include <Bounce2.h>
#include "Timer.h"

//dodajemy timer

Timer t;

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;

Bounce bouncer = Bounce(PRZYCISK, 25);
boolean wlaczony = false;
unsigned long przycisk_czas, wlaczony_czas;

void setup() {
 
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(SWIATLO, OUTPUT);
digitalWrite(LED0, HIGH);

pinMode(PIR, INPUT);
pinMode(PRZYCISK, INPUT_PULLUP);
t.every(500, PIRCheck);//co 500ms wykonywana jest metoda

}

void zmiana()
{
digitalWrite(SWIATLO, LOW);
wlaczony_czas = millis() + CZAS_SWIECENIA;
przycisk_czas = millis() + 1000;
wlaczony = !wlaczony;
detachInterrupt(digitalPinToInterrupt(PRZYCISK));
}

void loop() {
 t.update();
}


void PIRCheck() {
checkForMovement();
}

boolean checkForMovement() {
if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
if (digitalRead(PIR) == HIGH) { //wykryto ruch
state = true;
}
else {
state = false;
}
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
if (digitalRead(PIR) == HIGH) { //wykryto ruch
onTime = 0;
state = true;
}
}

lightControl(state);
return state;
}


void lightControl(boolean isStateOn) {
if (isStateOn) {
if (onTime < CZAS_SWIECENIA) {
digitalWrite(SWIATLO, HIGH);
onTime++;
}
}
else {
digitalWrite(SWIATLO, LOW);
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
 lightControl(checkForMovement());
}

if (onTime > CZAS_SWIECENIA) {
onTime = 0;
}
}



twoja metoda zmiana, nie mogła działać bo nie była nigdzie podpięta. Dopisałem obsługę przycisku Uśmiech


Kod:
#include "Timer.h"

//dodajemy timer

Timer t;

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;
boolean isSwitchOn = false;

boolean wlaczony = false;

void setup() {

 pinMode(LED0, OUTPUT);
 pinMode(LED1, OUTPUT);
 pinMode(SWIATLO, OUTPUT);
 digitalWrite(LED0, HIGH);

 pinMode(PIR, INPUT);
 pinMode(PRZYCISK, INPUT_PULLUP);
 t.every(500, PIRCheck);//co 500ms wykonywana jest metoda

}

void loop() {
 t.update();
}


void PIRCheck() {
 if (digitalRead(PRZYCISK) == LOW && !state) { //jezeli wcisnieto przycisk i status zapalania jest na false
   isSwitchOn = true;                          //to uruchom PIR
 }
 if (digitalRead(PRZYCISK) == LOW && state) {  //jezli wcisnieto przycisk i status zapalania jest na true
   isSwitchOn = false;                         //wylacz PIR
 }
 checkForMovement(isSwitchOn);
}

boolean checkForMovement(boolean isSwitchOn) {
 if (isSwitchOn) {
   if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
     if (digitalRead(PIR) == HIGH) { //wykryto ruch
       state = true;
     }
     else {
       state = false;
     }
   }

   if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
     if (digitalRead(PIR) == HIGH) { //wykryto ruch
       onTime = 0;
       state = true;
     }
   }

 }

 lightControl(state);
 return state;
}


void lightControl(boolean isStateOn) {
 if (isStateOn) {
   if (onTime < CZAS_SWIECENIA) {
     digitalWrite(SWIATLO, HIGH);
     onTime++;
   }
 }
 else {
   digitalWrite(SWIATLO, LOW);
 }

 if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
   lightControl(checkForMovement(true));
 }

 if (onTime > CZAS_SWIECENIA) {
   onTime = 0;
 }
}
>> Nie pomagam na PW. Od tego jest forum Uśmiech >> Koniecznie sprawdź: Jak dodawać załączniki

1 problem = 1 wątek
Odpowiedz
#7
(27-11-2017, 00:53)feriar napisał(a):
(26-11-2017, 23:57)Ronin napisał(a): Mam kłopot z przełącznikiem - nie wyłącza ani nie załącza. Po wgraniu ma się świecić czerwona i nie reagować na czujnik. Dopiero po załączeniu- dioda na zielono - ma reagować na czujnik. Teraz świeci na zielono. Chyba żebym do czujnika wlutował fotorezystor to wtedy ustawię w programie żeby jak się zrobi ciemniej reagował czujnik.  Cały czas załączone. Ile kosztuje Arduino Nano V 3.0?
Kod:
#include <Bounce2.h>
#include "Timer.h"

//dodajemy timer

Timer t;

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;

Bounce bouncer = Bounce(PRZYCISK, 25);
boolean wlaczony = false;
unsigned long przycisk_czas, wlaczony_czas;

void setup() {
 
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(SWIATLO, OUTPUT);
digitalWrite(LED0, HIGH);

pinMode(PIR, INPUT);
pinMode(PRZYCISK, INPUT_PULLUP);
t.every(500, PIRCheck);//co 500ms wykonywana jest metoda

}

void zmiana()
{
digitalWrite(SWIATLO, LOW);
wlaczony_czas = millis() + CZAS_SWIECENIA;
przycisk_czas = millis() + 1000;
wlaczony = !wlaczony;
detachInterrupt(digitalPinToInterrupt(PRZYCISK));
}

void loop() {
 t.update();
}


void PIRCheck() {
checkForMovement();
}

boolean checkForMovement() {
if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
if (digitalRead(PIR) == HIGH) { //wykryto ruch
state = true;
}
else {
state = false;
}
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
if (digitalRead(PIR) == HIGH) { //wykryto ruch
onTime = 0;
state = true;
}
}

lightControl(state);
return state;
}


void lightControl(boolean isStateOn) {
if (isStateOn) {
if (onTime < CZAS_SWIECENIA) {
digitalWrite(SWIATLO, HIGH);
onTime++;
}
}
else {
digitalWrite(SWIATLO, LOW);
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
 lightControl(checkForMovement());
}

if (onTime > CZAS_SWIECENIA) {
onTime = 0;
}
}



twoja metoda zmiana, nie mogła działać bo nie była nigdzie podpięta. Dopisałem obsługę przycisku Uśmiech


Kod:
#include "Timer.h"

//dodajemy timer

Timer t;

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;
boolean isSwitchOn = false;

boolean wlaczony = false;

void setup() {

 pinMode(LED0, OUTPUT);
 pinMode(LED1, OUTPUT);
 pinMode(SWIATLO, OUTPUT);
 digitalWrite(LED0, HIGH);

 pinMode(PIR, INPUT);
 pinMode(PRZYCISK, INPUT_PULLUP);
 t.every(500, PIRCheck);//co 500ms wykonywana jest metoda

}

void loop() {
 t.update();
}


void PIRCheck() {
 if (digitalRead(PRZYCISK) == LOW && !state) { //jezeli wcisnieto przycisk i status zapalania jest na false
   isSwitchOn = true;                          //to uruchom PIR
 }
 if (digitalRead(PRZYCISK) == LOW && state) {  //jezli wcisnieto przycisk i status zapalania jest na true
   isSwitchOn = false;                         //wylacz PIR
 }
 checkForMovement(isSwitchOn);
}

boolean checkForMovement(boolean isSwitchOn) {
 if (isSwitchOn) {
   if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
     if (digitalRead(PIR) == HIGH) { //wykryto ruch
       state = true;
     }
     else {
       state = false;
     }
   }

   if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
     if (digitalRead(PIR) == HIGH) { //wykryto ruch
       onTime = 0;
       state = true;
     }
   }

 }

 lightControl(state);
 return state;
}


void lightControl(boolean isStateOn) {
 if (isStateOn) {
   if (onTime < CZAS_SWIECENIA) {
     digitalWrite(SWIATLO, HIGH);
     onTime++;
   }
 }
 else {
   digitalWrite(SWIATLO, LOW);
 }

 if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
   lightControl(checkForMovement(true));
 }

 if (onTime > CZAS_SWIECENIA) {
   onTime = 0;
 }
}

Testuje teraz ten program. Mam już kupione:
Przycisk
Przekaźnik zasilanie 5 V przełącza 12 V
Dioda dwukolorowa Red Green
Brak w Bytomiu sklepu z Arduino.
Do kupienia:
Dwie listwy Led na 12 V
Zasilacz 12 V
Arduino Nano
Dwa metry kabla 
Wtyczka i gniazdo na kabel.

Co do programu to w której linii jest zapis świecenia diody dwukolorowej? Na zielono świeci a jak jest wyłączony to ma być na czerwono a świeci na zielono. Więc jak wyłączam to dalej zielona i chyba nie wyłącza czujnika bo dalej działa. Gdzie to zapisane? W których liniach? Próbowałem znaleźć sam.

(27-11-2017, 00:53)feriar napisał(a):
(26-11-2017, 23:57)Ronin napisał(a): Mam kłopot z przełącznikiem - nie wyłącza ani nie załącza. Po wgraniu ma się świecić czerwona i nie reagować na czujnik. Dopiero po załączeniu- dioda na zielono - ma reagować na czujnik. Teraz świeci na zielono. Chyba żebym do czujnika wlutował fotorezystor to wtedy ustawię w programie żeby jak się zrobi ciemniej reagował czujnik.  Cały czas załączone. Ile kosztuje Arduino Nano V 3.0?
Kod:
#include <Bounce2.h>
#include "Timer.h"

//dodajemy timer

Timer t;

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;

Bounce bouncer = Bounce(PRZYCISK, 25);
boolean wlaczony = false;
unsigned long przycisk_czas, wlaczony_czas;

void setup() {
 
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(SWIATLO, OUTPUT);
digitalWrite(LED0, HIGH);

pinMode(PIR, INPUT);
pinMode(PRZYCISK, INPUT_PULLUP);
t.every(500, PIRCheck);//co 500ms wykonywana jest metoda

}

void zmiana()
{
digitalWrite(SWIATLO, LOW);
wlaczony_czas = millis() + CZAS_SWIECENIA;
przycisk_czas = millis() + 1000;
wlaczony = !wlaczony;
detachInterrupt(digitalPinToInterrupt(PRZYCISK));
}

void loop() {
 t.update();
}


void PIRCheck() {
checkForMovement();
}

boolean checkForMovement() {
if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
if (digitalRead(PIR) == HIGH) { //wykryto ruch
state = true;
}
else {
state = false;
}
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
if (digitalRead(PIR) == HIGH) { //wykryto ruch
onTime = 0;
state = true;
}
}

lightControl(state);
return state;
}


void lightControl(boolean isStateOn) {
if (isStateOn) {
if (onTime < CZAS_SWIECENIA) {
digitalWrite(SWIATLO, HIGH);
onTime++;
}
}
else {
digitalWrite(SWIATLO, LOW);
}

if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
 lightControl(checkForMovement());
}

if (onTime > CZAS_SWIECENIA) {
onTime = 0;
}
}



twoja metoda zmiana, nie mogła działać bo nie była nigdzie podpięta. Dopisałem obsługę przycisku Uśmiech


Kod:
#include "Timer.h"

//dodajemy timer

Timer t;

#define PRZYCISK 2 // Przycisk załącz-wyłącz
#define SWIATLO 3 // Przekaznik                                                                                                                                                    
#define PIR 5  // Czujnik ruchu
#define LED0 13 //Czerwona wyłączony
#define LED1 12 //Zielona załączony
int CZAS_SWIECENIA = 600; // Czas świecenia 600/2 = 300s
int onTime = 0;
boolean state = false;
boolean isSwitchOn = false;

boolean wlaczony = false;

void setup() {

 pinMode(LED0, OUTPUT);
 pinMode(LED1, OUTPUT);
 pinMode(SWIATLO, OUTPUT);
 digitalWrite(LED0, HIGH);

 pinMode(PIR, INPUT);
 pinMode(PRZYCISK, INPUT_PULLUP);
 t.every(500, PIRCheck);//co 500ms wykonywana jest metoda

}

void loop() {
 t.update();
}


void PIRCheck() {
 if (digitalRead(PRZYCISK) == LOW && !state) { //jezeli wcisnieto przycisk i status zapalania jest na false
   isSwitchOn = true;                          //to uruchom PIR
 }
 if (digitalRead(PRZYCISK) == LOW && state) {  //jezli wcisnieto przycisk i status zapalania jest na true
   isSwitchOn = false;                         //wylacz PIR
 }
 checkForMovement(isSwitchOn);
}

boolean checkForMovement(boolean isSwitchOn) {
 if (isSwitchOn) {
   if (onTime == 0) { //jak czas swiecienia jest rowny 0 to zwracaj tylko status czujnika
     if (digitalRead(PIR) == HIGH) { //wykryto ruch
       state = true;
     }
     else {
       state = false;
     }
   }

   if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund
     if (digitalRead(PIR) == HIGH) { //wykryto ruch
       onTime = 0;
       state = true;
     }
   }

 }

 lightControl(state);
 return state;
}


void lightControl(boolean isStateOn) {
 if (isStateOn) {
   if (onTime < CZAS_SWIECENIA) {
     digitalWrite(SWIATLO, HIGH);
     onTime++;
   }
 }
 else {
   digitalWrite(SWIATLO, LOW);
 }

 if (onTime > 100 && onTime < 140) { //jezeli czas zalacznie przekaznika jest pomiedzy 50 a 70 sekund (sekundy x2 bo timer chodzi w interwałach co 0,5 sekundy)
   lightControl(checkForMovement(true));
 }

 if (onTime > CZAS_SWIECENIA) {
   onTime = 0;
 }
}

Testuje teraz ten program. Mam już kupione:
Przycisk
Przekaźnik zasilanie 5 V przełącza 12 V
Dioda dwukolorowa Red Green
Brak w Bytomiu sklepu z Arduino.
Do kupienia:
Dwie listwy Led na 12 V
Zasilacz 12 V
Arduino Nano
Dwa metry kabla 
Wtyczka i gniazdo na kabel.

Co do programu to w której linii jest zapis świecenia diody dwukolorowej? Na zielono świeci a jak jest wyłączony to ma być na czerwono a świeci na zielono. Więc jak wyłączam to dalej zielona i chyba nie wyłącza czujnika bo dalej działa. Gdzie to zapisane? W których liniach? Próbowałem znaleźć sam.
Jak nie chcesz odpowiedzieć to nie pisz !!!
Odpowiedz
#8
Pytałeś w Zabrzu w Scalaku? W Gliwicach znam też dwa sklepy z elektroniką.
Odpowiedz
#9
(27-11-2017, 21:05)tom5555 napisał(a): Pytałeś w Zabrzu w Scalaku? W Gliwicach znam też dwa sklepy z elektroniką.

Ja wiem o Nowy Elektronik Katowice i jeszcze sklep na osiedlu Tysiąclecia.
Jak nie chcesz odpowiedzieć to nie pisz !!!
Odpowiedz
#10
Jak nigdzie nie znajdziesz Nano po rozsądnej cenie, mogę odsprzedać jednego klona. Mam kilka w zapasie.
Odpowiedz


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości