• 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
Wielozadaniowość nrf24l01 + przyciski i diody
#1
Witam szanowne grono. Zwracam się do was z problemem, którego nie umiem rozwiązać.

Mój projekt ma polegać na tym, że mikrokontroler steruje diodą, która ma migać np co 1s. Jednocześnie ma wysyłać sygnał przez nrf do odbiornika np co 3s. Mikrokontroler obsługuje 3 przyciski. Pierwszy wyłącza świecenie diody. Drugi przycisk powoduje zmianę koloru diody[dioda RGB] i wysłać informację do odbiornika że przycisk został wciśnięty. Trzeci przycisk zmienia kolor diody i wysyła info że ten przycisk został wciśnięty.

A więc tak: nic nie miga -> naciskam 1 przycisk-> miga np dioda niebieska co 1s i jest wysyłany kod [np. 111] do odbiornika co 3s[informacja dla odbiornika, że jest połącznie]  -> naciskam przycisk 2 -> dioda zmienia kolor i miga co 1 s, wysyła kod np 112 do odbiornika -> naciskam przycisk 1 -> wyłączam miganie diody [po ponownym wciśnięciu miga dioda ze stanu na początku]

Nie umiem tego bardziej dokładniej wyjaśnić...

problem polega na tym, że projekt zacząłem jakiś rok temu i po długiej walce się poddałem. Niedawno odnowiłem temat ale ciągle nie mogę uzyskać odpowiedniego efektu.

Poniżej kody:

Prosiłbym o jakieś podpowiedzi/pomoc bo już nie mam do tego siły.
Kod:
#include <Timers.h>
#include "nRF24L01.h"
#include "RF24.h"
Timers <5> akcja;
int msg[1];
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;

int LED1 = 2;
int LED2 = 3;
int X;
int D1 = 4;
int D2 = 5;
int W = 6;
boolean buttonState = false;

void dioda_alarm()
{
if (digitalRead(D1) == HIGH)
{
msg[0] = 111;
radio.write(msg, 1);
digitalWrite(LED1, LOW);
X = LED2;
}
if (digitalRead(D2) == HIGH)
{
msg[0] = 112;
radio.write(msg, 1);
digitalWrite(LED1, LOW);
X = LED2;
}
}

void stan()
{
msg[0] = 113;
   radio.write(msg, 1);
}

void dioda_on()
{
   if (buttonState == 0)
 {
digitalWrite(X, HIGH);
 }
 if (buttonState == 1)
 {
 digitalWrite(LED1, LOW);
 digitalWrite(LED2, LOW);
 }
}

void dioda_off()
{
  if (buttonState == 0)
 {
 digitalWrite(X, LOW);
}
if (buttonState == 1)
 {
 digitalWrite(LED1, LOW);
 digitalWrite(LED2, LOW);
}
}

void checkW()
{
 if (digitalRead(W) == HIGH) {
       buttonState = !buttonState;
       X=LED1;
       delay(30);
   }    
}

void setup()
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(W, INPUT);
pinMode(D1, INPUT);
pinMode(D2, INPUT);
X = LED1;
radio.begin();
radio.openWritingPipe(pipe);
akcja.attach(0,200,dioda_alarm);
akcja.attach(1,5000,stan);
akcja.attach(2,1000,dioda_on);
akcja.attach(3,2000,dioda_off);
akcja.attach(4,20,checkW);
}

void loop()
{
akcja.process();
}

Teraz nadajnik działa jako tako. Wysyła sygnały, zmienia kolor diody, ale mam problem z przyciskiem wyłączającym... Często jest tak, że nie załapuje, że dioda ma przestać albo zacząć migać... Przyciski są podciągnięte rezystorami. Wydaje mi się, że to wina kodu, ale nie wiem co tu zmienić... ;/

Proszę o pomoc


Ufff... edytuję, bo po raz kolejny zasiadłem do tego projektu (nawet nie liczę ile razy zmieniałem ten kod...)
Udało mi się ogarnąć obsługę przycisku włączania/wyłączania [W] i teraz reaguje prawie za każdym razem.
Sygnał czuwania do odbiornika wysyłany jest w momencie zapalania diody w nadajniku, żeby trochę zoptymalizować proces i nie dokładać kolejnych.

Program starałem się ogarnąć, żeby to jakoś wyglądało. Jeśli ktoś zauważy błąd albo ma pomysł na dalszą optymalizację to będę wdzięczny za podpowiedzi.
 
Odpowiedź
#2
Zerknij no tutaj. Arduino jest trochę słabe na takie zabawy, ale dla prostych rzeczy powinno wystarczyć.
 
Odpowiedź
#3
(27-01-2017, 10:54)krn78 napisał(a): Zerknij no tutaj. Arduino jest trochę słabe na takie zabawy, ale dla prostych rzeczy powinno wystarczyć.

Dzięki za info. Zerknę w wolnej chwili. Aktualnie jakoś udało się ogarnąć program i śmiga całkiem nieźle. Problem polegał na obsłudze przycisku.

Jeszcze mam problem z nrf24l01... Czy ten moduł ma jakieś ograniczenie dł kabla od arduino? Wszystko działa na dł kabli ze zworkami pod płytki stykowe i 1  max 2 długości tych kabli ogarnia a potem nie ma przesyłu. Da się to jakoś rozwiązać?
 
Odpowiedź
#4
(27-01-2017, 11:04)inazuma-akai napisał(a): Jeszcze mam problem z nrf24l01... Czy ten moduł ma jakieś ograniczenie dł kabla od arduino? Wszystko działa na dł kabli ze zworkami pod płytki stykowe i 1  max 2 długości tych kabli ogarnia a potem nie ma przesyłu. Da się to jakoś rozwiązać?
To nie problem nrf24l01 tylko SPI po którym sterujesz nrf24l01. SPI wymyślono "na płytki" więc odległości transmisji nie są zbyt duże. Zacznij od zmniejszenia częstotliwości transmisji po SPI.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
(27-01-2017, 12:06)namok napisał(a):
(27-01-2017, 11:04)inazuma-akai napisał(a): Jeszcze mam problem z nrf24l01... Czy ten moduł ma jakieś ograniczenie dł kabla od arduino? Wszystko działa na dł kabli ze zworkami pod płytki stykowe i 1  max 2 długości tych kabli ogarnia a potem nie ma przesyłu. Da się to jakoś rozwiązać?
To nie problem nrf24l01 tylko SPI po którym sterujesz nrf24l01. SPI wymyślono "na płytki" więc odległości transmisji nie są zbyt duże. Zacznij od zmniejszenia częstotliwości transmisji po SPI.

Aktualnie kod wygląda tak:
Kod:
#include <Timers.h>
#include "nRF24L01.h"
#include "RF24.h"
Timers <5> akcja;
int msg[1];
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;

int LED1 = 2;
int LED2 = 3;
int X;
int D1 = 4;
int D2 = 5;
int W = 6;
int Y;
boolean buttonState = false;

void dioda_alarm()
{
if (digitalRead(D1) == HIGH)
{
msg[0] = 111;
radio.write(msg, 1);
digitalWrite(LED1, LOW);
X = LED2;
}
if (digitalRead(D2) == HIGH)
{
msg[0] = 112;
radio.write(msg, 1);
digitalWrite(LED1, LOW);
X = LED2;
}
}

void stan()
{
msg[0] = 113;
  radio.write(msg, 1);
}

void dioda_on()
{
  if (buttonState == 0)
{
digitalWrite(X, HIGH);
}
if (buttonState == 1)
{
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
}
}

void dioda_off()
{
 if (buttonState == 0)
{
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
}
if (buttonState == 1)
{
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
}
}

void checkW()
{
if (digitalRead(W) == LOW) {
 while(digitalRead(W)==LOW){
      buttonState = !buttonState;
      X=LED1;
      delay(300);
  }    }
 
}

void setup()
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(W, INPUT);
digitalWrite(W, HIGH);
pinMode(D1, INPUT);
pinMode(D2, INPUT);
X = LED1;
radio.begin();
radio.openWritingPipe(pipe);
akcja.attach(0,200,dioda_alarm);
akcja.attach(1,1500,stan);
akcja.attach(2,1000,dioda_on);
akcja.attach(3,2000,dioda_off);
akcja.attach(4,40,checkW);
}

void loop()
{
akcja.process();
}
I chyba na razie taki zostanie. Przyciski dobrze reagują i jest git. Muszę jeszcze sprawdzić zasięg, bo nadajnik będzie w samochodzie.

W sprawie SPI. Mógłbyś konkretnie podpowiedzieć jak mam zmienić częstotliwość SPI? I czy wpłynie to negatywnie na zasięg?
Jak widzisz program powyżej to zlepek jakiś kodów jakie udało mi się znaleźć w internecie. Pojęcia o programowaniu troszkę mam ale z arduino zacząłem od w sumie niedawna i nie ogarniam do końca co do czego.
Prosiłbym o pomoc na jakimś przykładzie, żebym potem mógł dostosować to do mojego kodu..
 
Odpowiedź
#6
Teoretycznie wystarczy zmienić wartość w linii 66 pliku RF24_config.h na mniejszą
Kod:
const uint32_t RF24_SPI_SPEED = 10000000;
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#7
(27-01-2017, 16:56)namok napisał(a): Teoretycznie wystarczy zmienić wartość w linii 66 pliku RF24_config.h na mniejszą
Kod:
const uint32_t RF24_SPI_SPEED = 10000000;

Sprawdzę to, ale najpierw przetestuję jaki zasięg mają te moduły. A z racji tego, że jeszcze zimo na dworze to może to trochę potrwać. Jeśli moduł nie będzie miał zakłóceń mimo upakowania w karoserii samochodu to nie będę drążył tematu skoro wszystko będzie OK.

To jeszcze jedna sprawa skoro w końcu ktoś jest chętny pomóc. Nadajnik będzie zasilany z Powerbanka. Aktualnie posiadam Romoss Solo 6 i korzystam z niego w warunkach domowych. Problem jednak polega na tym, że po 10s się wyłącza z racji zbyt małego poboru prądu.

Obciążyłem układ 5diodami LED [2 czerwone, 3 UV] i rezystorami (150 i 80ohm). Takie graty miałem pod ręką to wpiąłem. Ma ktoś może pomysł jak obciążyć ten układ, żeby powerbank się nie wyłączał ale też żeby mi się nic ciągle na płytce nie świeciło? Dodatkowo powiem, że rezystorki też się trochę nagrzewają co mi nie odpowiada...
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości