• 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ź
  


Wiadomości w tym wątku
Wielozadaniowość nrf24l01 + przyciski i diody - przez inazuma-akai - 25-01-2017, 14:25

Skocz do:


Przeglądający: 1 gości