Skocz do zawartości

Adafruit Feather 32u4 Bluefruit LE - obsługa buttonów


dórzy92

Pomocna odpowiedź

Cześć,
nie mogę sobie poradzić z czymś takim:

Mam kod do komunikacji z aplikacją Androidową. Wszystko działa poprawnie, jednak za kazdym razem jak wyśle coś do Adafruita to zadana akcja wykonuje się tylko raz.

Potrzebuję zrobić funkcję, która będzie działać w pętli - do czasu pozyskania nowej akcji przez bluetootha.Jak to przerobić?

Mój kod:

/*********************************************************************
 Program do robota  SECUNDO
*********************************************************************/

#include <string.h>
#include <Arduino.h>
#include <SPI.h>
#if not defined (_VARIANT_ARDUINO_DUE_X_) && not defined (_VARIANT_ARDUINO_ZERO_)
#include <SoftwareSerial.h>
#endif

#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#include "BluefruitConfig.h"


#define FACTORYRESET_ENABLE         1
#define MINIMUM_FIRMWARE_VERSION    "0.6.6"
#define MODE_LED_BEHAVIOUR          "MODE"
/*=========================================================================*/
/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);

/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST */
//Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
//                             BLUEFRUIT_SPI_MOSI, BLUEFRUIT_SPI_CS,
//                             BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);


void error(const __FlashStringHelper*err) {
 Serial.println(err);
 while (1);
}

// function prototypes over in packetparser.cpp
uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout);
float parsefloat(uint8_t *buffer);
void printHex(const uint8_t * data, const uint32_t numBytes);
extern uint8_t packetbuffer[];

String message;
String action;
/**************************************************************************/
/*!
   @brief  Sets up the HW an the BLE module (this function is called
           automatically on startup)
*/
/**************************************************************************/
void setup(void)
{
 while (!Serial);  // required for Flora & Micro
 delay(500);

 /*ALL PINS*/
 Serial.begin(115200);
 Serial.println(F("Adafruit Bluefruit App Controller Example"));
 Serial.println(F("-----------------------------------------"));

 /* Initialise the module */
 Serial.print(F("Initialising the Bluefruit LE module: "));

 if ( !ble.begin(VERBOSE_MODE) )
 {
   error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
 }
 Serial.println( F("OK!") );

 if ( FACTORYRESET_ENABLE )
 {
   Serial.println(F("Performing a factory reset: "));
   if ( ! ble.factoryReset() ) {
     error(F("Couldn't factory reset"));
   }
 }

 ble.echo(false);
 Serial.println("Requesting Bluefruit info:");
 ble.info();

 Serial.println(F("Please use Adafruit Bluefruit LE app to connect in Controller mode"));
 Serial.println(F("Then activate/use the sensors, color picker, game controller, etc!"));
 Serial.println();
 ble.verbose(false);  // debug info is a little annoying after this point!
 while (! ble.isConnected()) {
   delay(500);
 }
 Serial.println(F("******************************"));
 // LED Activity command is only supported from 0.6.6
 if ( ble.isVersionAtLeast(MINIMUM_FIRMWARE_VERSION) )
 {
   Serial.println(F("Change LED activity to " MODE_LED_BEHAVIOUR));
   ble.sendCommandCheckOK("AT+HWModeLED=" MODE_LED_BEHAVIOUR);
 }
 Serial.println( F("Switching to DATA mode!") );
 ble.setMode(BLUEFRUIT_MODE_DATA);

 Serial.println(F("******************************"));

}

/**************************************************************************/
/*!
   @brief  Constantly poll for new command or response data
*/
/**************************************************************************/
void loop(void)
{
 uint8_t len = readPacket(&ble, BLE_READPACKET_TIMEOUT);
 if (len == 0) return;

 // Buttons
 if (packetbuffer[1] == 'B') {
   uint8_t buttnum = packetbuffer[2] - '0';
   boolean pressed = packetbuffer[3] - '0';
   String num = String(buttnum);
   if (pressed) {
     action = " pressed";
   } else {
     action = " released";
   }
   message = "Button " + num + action;
   Serial.println("Message: " + message);
 }


 if(action != " released"){
   if(message == "Button 1 pressed"){
         programMode1();
   }else if(message == "Button 5 pressed"){
       Serial.println("5");
   }else if(message == "Button 6 pressed"){
      Serial.println("6");
   }else if(message == "Button 7 pressed"){
      Serial.println("7");
   }else if(message == "Button 8 pressed"){
      Serial.println("8");
   }else if(message == "Button 2 pressed"){
      Serial.println("2");
   }
}else{
       Serial.println("released");
 }
}


void programMode1() {
 Serial.println("In mode 1");
}

Chciałbym aby funkcja programMode1() wykonywała się do czasu odebrania nowych danych przez bluetooth. Pomożecie?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.