Czujnik do oświetlenia schodowego

dobo
Posts: 1051
Joined: Sun Apr 07, 2019 8:14 pm
Location: Nadarzyn

Post

Zbudowałem nowy czujnik do załączania oświetlenia schodowego z tego tematu viewtopic.php?p=101475#p101475 filmik z działania oświetlenia schodów https://youtu.be/6iJFGjyCCfQ

Ten czujnik viewtopic.php?p=116275#p116275 na dole działa można powiedzieć, że bardzo dobrze natomiast na piętrze słabiej. Może to być wina, że ten czujnik ma zakres od 5 do 80cm wykrywania moje schody mają prawie 110 cm szerokości. Na dole przeważnie wchodzi się na schody środkiem natomiast na piętrze prawie przed czujnikiem schodzi się na lewo do barierki i tu może być przyczyna bo gdy schodzi się z pomieszczenia, które jest po prawej stronie to nie ma problemu z załączaniem się podświetlenia choć może znalazłem dla tego czujnika rozwiązanie polegające na zmianie osłony i powiększeniu otworu na soczewkę czujnika.
Natomiast myślałem nad zaadoptowaniem czujnika laserowego Pololu ale jego stałe nastawy mnie zniechęciły do jego zastosowania.
Image

Nie znalazłem innego podobnego czujnika do Pololu więc pomyślałem, że zbuduję sobie czujnik, który ma regulowaną odległość wykrywania obiektu. Zacząłem się bardziej zagłębiać jak to zrobić ogarnąłem już temat z regulacją odległości wykrywania obiektu za pomocą potencjometru i przypadkowo natrafiłem w necie na filmik z czujnikiem laserowym DRL-12-1 firmy F&F tylko cena tego czujnika jest troszkę zaporowa jak dla mnie biorąc pod uwagę co sam już zrobiłem. W moim czujniku dorobiłem regulację impulsu załączającego podświetlenie schodów podobną jak w DRL ale po swojemu. Podzieliłem potencjometr na dwie części jedna część reguluje czas impulsu od 100ms do 1s, a druga połowa potencjometru zakres od 30 sekund do 10 minut. Dołożyłem też fotorezystor, który ma załączać czujnik gdy będą odpowiednie warunki (noc) choć zastanawiam się też nad rozwiązaniem z podaniem stanu niskiego na określony pin np. stan ten musiałby być podany z zewnętrznego czujnika lub urządzenia np. ESP. Możliwe, że dołożę taką opcję do fotorezystora pomyślę jeszcze jak to zaimplementować i czy warto.

Filmik z działania czujnika do oświetlenia schodowego https://youtu.be/_xbv6ZkMoQQ

PS. Do diody LED może zostać podłączony przekaźnik lub mosfet albo oba jednocześnie z możliwością wyboru tu też się zastanawiam nad rozwiązaniem.
User avatar
uchnast.michal
Posts: 1334
Joined: Tue Jun 04, 2019 11:37 am
Has thanked: 7 times

Post

Ja użyłem czujnika odległości pracujący w określonym zakresie (5-85cm) z laserowego zrezygnowałem ponieważ "nie widzi czarnych ubrań" kolor skóry nie był testowany:). Pozostałe na podobnym działaniu, sprawdza się 4 rok. Jak odszukamy kod, chętnie również się podzielę.

Kod dla arduino nano
Nie jest optymalny ani elegancki ale działa. Opis w dużym skrócie.
Włącza się gdy wartość lumenów spadnie poniżej wartości. Do czasu zgaszenia warunek lumenów jest pomijany, Każde przekroczenie odlicza od nowa. Gdy odległość jest stała traktuje jako stała przeszkoda i ignoruje. Wartości w zmiennych, nie przewidywałem potencjometrów. Szkic szyty pod konkretne warunki:)

Code: Select all

#define LED1 2
#define PRZEK1 7
#define trigPin1 5
#define echoPin1 6
#define trigPin2 3
#define echoPin2 4
#define ledStatus 8
#define LightSensor A0

//const
int stanPRZEK1 = HIGH;
int rozncaDystansu = 10; //20
int minDystans = 5;
int maxDystans = 85; //80
bool stanOswietlenia = false;
int czasSwiecenia = 30*1000; // w sekundach
int minLum = 100; //minimalna ilość lumenów przy której może właczyć się oświetlenie
int currentLum = 0;

long duration1, duration2, czas1, czas2, dystans1, dystans2;
int distance, aktDistance1, aktDistance2, fotoDane;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long rozincaCzasu = 0;

bool showLogs = true;

void logs() {
  Serial.println((String)"Aktualny czas "+(aktualnyCzas/1000)+" sek. "+zapamietanyCzas/1000+" sek. pozostało: "+((zapamietanyCzas+czasSwiecenia)-aktualnyCzas)/1000);
  Serial.println((String)"Dystans1: "+dystans1+"cm dystans2: "+dystans2+"cm");
  Serial.println((String)"Oswietlenie = "+currentLum);
}

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(0);
  pinMode(2, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(LED1,OUTPUT);
  pinMode(PRZEK1, OUTPUT);
  pinMode(trigPin1, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
  pinMode(echoPin1, INPUT); //a echo, jako wejście
  pinMode(trigPin2, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
  pinMode(echoPin2, INPUT); //a echo, jako wejście
}

void loop() {
  unsigned long aktualnyCzas = millis();
  currentLum = analogRead(LightSensor);
  if ( aktualnyCzas >= zapamietanyCzas+czasSwiecenia) zapamietanyCzas = 0;
  if( (currentLum <= minLum) or (stanPRZEK1 == HIGH) ) {
    if(stanPRZEK1 == HIGH){ digitalWrite(ledStatus, HIGH); } else { digitalWrite(ledStatus, LOW);}; //podświetlanie czujników, informacja czy aktywne
    
    digitalWrite(trigPin1, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin1, HIGH);
    delayMicroseconds(2);
    digitalWrite(trigPin1, LOW);
    czas1 = pulseIn(echoPin1, HIGH);
    dystans1 = czas1 / 58;
    
    digitalWrite(trigPin2, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin2, HIGH);
    delayMicroseconds(2);
    digitalWrite(trigPin2, LOW);
    czas2 = pulseIn(echoPin2, HIGH);
    dystans2 = czas2 / 58;
    
    if ( 
      // warunki dystansu
      ( ( dystans1 >= minDystans && dystans1 <= maxDystans ) || ( dystans2 >= minDystans && dystans2 <= maxDystans ) )
     &&
      // sprawdzenie stałego obiektu
     ( aktDistance1 - dystans1 > rozncaDystansu || dystans1 - aktDistance1 > rozncaDystansu || aktDistance2 - dystans2 > rozncaDystansu || dystans2 - aktDistance2 > rozncaDystansu )
    ){
      zapamietanyCzas = aktualnyCzas;
      if ( zapamietanyCzas > 0UL ) { digitalWrite(2, HIGH); digitalWrite(PRZEK1,LOW); Serial.println("GO"); stanPRZEK1 = HIGH;}
    }

  }else{
    digitalWrite(ledStatus, LOW);
  }
 
  if ( zapamietanyCzas == 0 ) {digitalWrite(2, LOW); digitalWrite(PRZEK1, HIGH); stanPRZEK1 = LOW;}
  aktDistance1 = dystans1; aktDistance2 = dystans2;
  if (showLogs == true) {logs();}
  delay(20); //50
}

dobo
Posts: 1051
Joined: Sun Apr 07, 2019 8:14 pm
Location: Nadarzyn

Post

Przed chwilą skończyłem przerzucanie kodu z Nano na Attiny od niedawna kumpluję się z ChatGPT i "programowanie" jest dużo łatwiejsze ;)

Tak teraz to wygląda na płytce
.
czujnik do załączania oświetlenia schodów.jpg


Ponadto na uart wysyłane są wartości z potencjometrów i czujników
.
dane z czujnika do załączania oświetlenia schodów.png
You do not have the required permissions to view the files attached to this post.
User avatar
YoMan
Posts: 3521
Joined: Thu Apr 30, 2020 5:18 pm
Location: Częstochowa
Has thanked: 3 times
Been thanked: 3 times

Post

dobo wrote: Sun Jan 21, 2024 11:21 pm
Nie znalazłem innego podobnego czujnika do Pololu więc pomyślałem, że zbuduję sobie czujnik, który ma regulowaną odległość wykrywania obiektu.
LD2410 - konfigurujesz przez prostą apkę na BT. ustawiasz odległość od obiektu i jego "wielkość", ustawiasz również czas trzymania HI, oraz wykrywanie osoby stojącej nieruchomo. Dla mnie rewelacyjny moduł
YoMan
________________________________________
Wziąłem udział w SOP2023 & SOP2024
dobo
Posts: 1051
Joined: Sun Apr 07, 2019 8:14 pm
Location: Nadarzyn

Post

Mam to ale się jeszcze nie bawiłem. Zastanawiam się nad tym jak będę przechodził obok tego czujnika ale nie będę wchodził na schody. To jest czujnik obecności i rozumiem go w ten sposób, że wykrywa on osoby będące w pomieszczeniu niezależnie czy się ruszają czy są nieruchome. A tu potrzeba akcji w sytuacji przekroczenia linii.

Return to “Ogólna dyskusja”