• 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 + nrf24l01 - alarm samochodowy.
#1
Witam zacne grono użytkowników Wink

Jestem początkujący w arduino, ale umiem szukać informacje w internecie i jakoś idzie Smile

Od dłuższego czasu siedzę nad "projektem" alarmu - powiedzmy, że zastosowanie w samochodzie.

Zasada działania: Nadajnik z nrf24l01 znajduje się w samochodzie ma diodę, która miga np co sekundę. Są 2 przyciski. Jeden po naciśnięciu daje sygnał do odbiornika w którym załącza się buzzer, drugi przycisk służy do wyłączenia migającej diody.

Pierwszy przycisk nadajnika będzie kiedyś zastąpiony np krańcówką która będzie sprawdzała czy ktoś nie otworzył drzwi. Jeśli będą otwarte(naciśnięty przycisk) w domu włączy mi się alarm.

Drugi przycisk wyłącza/włącza diodę bo ciągłe miganie podczas jazdy byłoby niebezpieczne.

Wzorując się na poradnikach w sieci np: http://roboblog.eu/2016/03/12/nrf24l01/

Udało mi się zrobić odbiornik i nadajnik.

Niestety mam PROBLEM. Nie wiem jak dołączyć do programu miganie diody i jej wyłączanie tak aby nie przerywać pracy nadajnika nrf24l01.

Program który napisałem wstawię później bo aktualnie nie mam do niego dostępu.
Udało mi się jakoś to ominąć ale np żeby wyłączyć diodę muszę trafić  z naciśnięciem w odpowiedni moment w pętli i to jest bezużyteczne.

Jeśli ktoś może to proszę o pomoc. Projekt wydaje mi się fajny i przydatny a nie spotkałem w sieci podobnych projektów gdzie potrzebne jest kilka akcji wykonywanych jednocześnie.

Jedyna opcja jaką widzę to kroki:
Wysyłam sygnał -> dioda zapalona (sygnał nie jest wysyłany) -> wysyłam sygnał -> dioda zgaszona (sygnał nie jest wysyłany).

Teraz doszedłem do jakiegoś innego sposobu i to jakoś działało ale już nie pamiętam. Wrócę to jak najszybciej wstawię kod. Projekt męczę od pół roku i w końcu się odważyłem do was napisać.
 
Odpowiedź
#2
Witam.
Można to zrobić co najmniej na dwa sposoby.
Jeśli potrzebujesz działania wielowatkowego to najlepiej posłużyć się biblioteką timers.h która jest nawet tu na forum dobrze opisana.
Pozdrawiam.
 
Odpowiedź
#3
(05-01-2017, 17:38)Smaczek napisał(a): Witam.
Można to zrobić co najmniej na dwa sposoby.
Jeśli potrzebujesz działania wielowatkowego to najlepiej posłużyć się biblioteką timers.h która jest nawet tu na forum dobrze opisana.
Pozdrawiam.

Dzięki za podpowiedź. Bibliotekę znalazłem i po dniu prób i błędów doszedłem do w miarę zadowalającego projektu.

Nadajnik:
Kod:
#include <Timers.h>
#include "nRF24L01.h"
#include "RF24.h"
Timers <2> akcja;
int msg[1];
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int SW1 = 4;
int SW2 = 2;
int switchPin = 6;
int LED = 5;
boolean currentButton = LOW;
boolean lastButton = LOW;
boolean stan = false;

void dioda()
{
if (digitalRead(SW1) == HIGH)
{
msg[0] = 111;
radio.write(msg, 1);
}
if (digitalRead(SW2) == HIGH)
{
msg[0] = 112;
radio.write(msg, 1);
}
digitalWrite(LED, LOW);    
}

void dioda2()
{
if (digitalRead(SW1) == HIGH)
{
msg[0] = 111;
radio.write(msg, 1);
}
if (digitalRead(SW2) == HIGH)
{
msg[0] = 112;
radio.write(msg, 1);
}
digitalWrite(LED, HIGH);    
}

boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin);
  if (current != lastButton)
  {
     delay(5);
     current = digitalRead(switchPin);
  }
  return current;
}

void setup()
{
pinMode(LED, OUTPUT);
pinMode(switchPin, INPUT);
radio.begin();
radio.openWritingPipe(pipe);
akcja.attach(0,1,dioda);
akcja.attach(1,1000,dioda2);
}

void loop()
{
    currentButton = debounce(lastButton);

  if (currentButton == HIGH)
 { stan = !stan;
  delay(5);
 }
  if (stan == true)
  {
   akcja.process();
  }
}

Odbiornik:
Kod:
#include "nRF24L01.h"
#include "RF24.h"
int msg[1];
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int LED1 = 3;
int LED2 = 5;
int BUZZ1 = 6;

void setup()
{

radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(BUZZ1, OUTPUT);
}

void loop()
{
if (radio.available())
{
  bool done = false;    
  while (!done){
    radio.read(msg, 1);      
    if (msg[0] == 111)
{

digitalWrite(LED1, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(200);
digitalWrite(LED1, LOW);
digitalWrite(BUZZ1, LOW);
delay(200);
digitalWrite(LED1, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(50);
digitalWrite(LED1, LOW);
digitalWrite(BUZZ1, LOW);
delay(50);
digitalWrite(LED1, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(50);
digitalWrite(LED1, LOW);
digitalWrite(BUZZ1, LOW);
delay(50);
digitalWrite(LED1, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(50);
digitalWrite(LED1, LOW);
digitalWrite(BUZZ1, LOW);
delay(50);
}
if (msg[0] == 112)
{

digitalWrite(LED2, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(200);
digitalWrite(LED2, LOW);
digitalWrite(BUZZ1, LOW);
delay(200);
digitalWrite(LED2, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(50);
digitalWrite(LED2, LOW);
digitalWrite(BUZZ1, LOW);
delay(50);
digitalWrite(LED2, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(50);
digitalWrite(LED2, LOW);
digitalWrite(BUZZ1, LOW);
delay(50);
digitalWrite(LED2, HIGH);
digitalWrite(BUZZ1, HIGH);
delay(50);
digitalWrite(LED2, LOW);
digitalWrite(BUZZ1, LOW);
delay(50);
}
    else {digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(BUZZ1, LOW);
}
}}

}

Jeszcze muszę zrobić na bibliotece Timers odbiornik i będzie gites.

Aktualnie projekt wygląda tak:
NADAJNIK - 3 przyciski. 1przycisk wyłącza i włącza miganie diodą. 2 kolejne to alarmy dla np otwarcia drzwi w samochodzie ( lewe i prawe ).
Odbiornik rozpoznaje które drzwi są otworzone i zapala odpowiednią diodę +buzzer.

Mam tylko problem jak dopracować obsługę przycisku włączania i wyłączania diody bo czasem łapie a czasem nie. Kod znaleziony gdzieś w sieci ale działa. Ale nie zawsze załapie.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości