Tryck och temperaturövervakning (4 / 10 steg)
Steg 4: Utnyttjande du BMP180
Häll lire les valeurs capté par le BMP 180 il faut modifier le projet précédemment importé. Il faut en faire un inkluderar BMP085.h qui est le header familjefilter à la classe contenant les Méthode propre à notre capteur.
Le kod est composé de 2 fonctions rektor:
- WrittenHandler: upplysta le buffert envoyé par la hallon au RedBearLab afin de setter un booléen permettant de savoir quel modul est solicité par la hallon
- m_status_check_handle: Cette fonction est appelé périodiquement, elle kontrollören si une demande de relevé en été faite au capteur si oui elle envoi la valeur lu par le capteur à la hallon via la la méthode updateCharacteristicValue
La périodicité d'appelle à la fonction m_status_check_handle est réglé par l'objet ticker grâce à la méthode bifoga_us.
#include "mbed.h"
#include "ble/BLE.h"
#include "ble/FunctionPointerWithContext.h"
#include "Servo.h"
#include "GattCallbackParamTypes.h"
#include "BMP085.h" < /p >< p > #define BLE_UUID_TXRX_SERVICE 0x0000 / ** < tjänsten nordiska UART UUID. */
#define BLE_UUID_TX_CHARACTERISTIC 0x0002 / ** < UUID TX kännetecken. */
#define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 / ** < UUID RX kännetecken. */
#define TXRX_BUF_LEN 20
#define DIGITAL_OUT_PIN P0_17 //D7
#define DIGITAL_IN_PIN P0_5 //A4
#define PWM_PIN P0_16 //D6
#define SERVO_PIN P0_14 //D10
#define ANALOG_IN_PIN P0_1 //A0
BLE ble;
DigitalOut LED_SET(DIGITAL_OUT_PIN);
DigitalIn BUTTON(DIGITAL_IN_PIN);
PwmOut PWM(PWM_PIN);
Analog ANALOG(ANALOG_IN_PIN);
Servo MYSERVO(SERVO_PIN);
BMP085 myCaptor (P0_29, P0_28);
Seriell pc (USBTX, USBRX);
statisk uint8_t analog_enabled = 0;
statisk uint8_t captor_enabled = 0;
statisk uint8_t captor_enabled_for_pressure = 0;
Den nordiska UART tjänsten
statisk const uint8_t uart_base_uuid [] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
statisk const uint8_t uart_tx_uuid [] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
statisk const uint8_t uart_rx_uuid [] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
statisk const uint8_t uart_base_uuid_rev [] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71}; < /p >< p > uint8_t txPayload [TXRX_BUF_LEN] = {0};
uint8_t rxPayload [TXRX_BUF_LEN] = {0};
GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
GattCharacteristic * uartChars [] = {& txCharacteristic, & rxCharacteristic};
GattService uartService (uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
void disconnectionCallback (const Gap::DisconnectionCallbackParams_t * params)
{
PC.printf ("frånkopplad \r\n");
PC.printf ("omstart reklam \r\n");
ble.startAdvertising();
}
void confirmationHandler(uint16_t Handler)
{
om (captor_enabled)
captor_enabled = false;
}
void WrittenHandler (const GattWriteCallbackParams * Handler)
{
uint8_t buf [TXRX_BUF_LEN];
uint16_t bytesRead, index.
om (Handler -> handtag == txCharacteristic.getValueAttribute().getHandle())
{
ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, & bytesRead);
MEMSET (txPayload, 0, TXRX_BUF_LEN);
memcpy (txPayload, buf, TXRX_BUF_LEN);
för (index = 0; index < bytesread; index ++) = "" pc.putc(buf[index]); = "" om (buf [0] = "=" 0x01) = "" {= "" om (buf [1] = "=" 0x02) = "" while(1) = "" led_set = "! LED_SET,"wait(0.25); =" "} =" "annars =" "0xa0) =" "analog_enabled ="1;"captor_enabled ="1;" 0x03) = "" captor_enabled_for_pressure = "1;" float = "" värde = "(float) buf [1] / 255;" pwm = "värde";} < = "" p = "" >< / bytesread; >< /p >< p > void m_status_check_handle(void)
{
uint8_t buf [4].
om (analog_enabled) / / om analog läsning aktiverad
{
Läsa och skicka
flyta s = ANALOG;
uint16_t värde = s * 1024;
BUF [0] = (0x0B);
BUF [1] = (värde >> 8);
BUF [2] = (värde);
ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
}
om (captor_enabled) / / om analog läsning aktiverad
{
Läsa och skicka
captor_enabled = false;
myCaptor.update();
flyta s = myCaptor.get_temperature() * 100;
int värde = s;
BUF [0] = (värde >> 24);
BUF [1] = (värde >> 16);
BUF [2] = (värde >> 8);
BUF [3] = värde;
för (int jag = 0; jag < 200000; ++ jag)
ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 4);
}
Lägg till för att få trycket
om (captor_enabled_for_pressure)
{
Läsa och skicka
captor_enabled_for_pressure = false;
myCaptor.update();
flyta s = myCaptor.get_pressure() * 100;
uint32_t värde = s;
BUF [0] = (värde >> 24);
BUF [1] = (värde >> 16);
BUF [2] = (värde >> 8);
BUF [3] = värde;
ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 4);
}
} < /p >< p > int main(void)
{
Ticker ticker;
ticker.attach_us (m_status_check_handle, 200000);
ble.init();
ble.onDisconnection(disconnectionCallback);
ble.onDataWritten(WrittenHandler);
ble.onConfirmationReceived(confirmationHandler);
PC.baud(9600);
PC.printf ("SimpleChat Init \r\n");
installationsprogrammet för reklam
ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
ble.accumulateAdvertisingPayload (GapAdvertisingData::SHORTENED_LOCAL_NAME,
(const uint8_t *) "Mustafa", sizeof("Mustafa") - 1);
ble.accumulateAdvertisingPayload (GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
(const uint8_t *) uart_base_uuid_rev, sizeof(uart_base_uuid));
100ms; i multiplar av 0.625ms.
ble.setAdvertisingInterval(160);
ble.addService(uartService);
ble.startAdvertising();
PC.printf ("reklam börja \r\n");
While(1)
{
ble.waitForEvent();
}
}