Кто работал с библиотекой BLEServer.h, помогите

skynepdai

✩✩✩✩✩✩✩
9 Мар 2020
19
0
Доброго времени суток, форумчане! При расширении возможности мобильного анализатора температуры, влажности, давления и углекислого газа решил подружить его с андроидом. Но наткнувшись на вариант отправки на сайте тут, не могу заставить код формировать строку для отправки.
Код для esp32:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <TFT_ILI9163C.h>
#include "SoftwareSerial.h"
#include "GyverTimer.h"
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>

// DO NOT CHANGE THE NEXT UUIDs
// Otherwise, you also need to modify the Android application used in this project
#define SERVICE_UUID            "C6FBDD3C-7123-4C9E-86AB-005F1A7EDA01"
#define CHARACTERISTIC_UUID_RX  "B88E098B-E464-4B54-B827-79EB2B150A9F"
#define CHARACTERISTIC_UUID_TX  "D769FACF-A4DA-47BA-9253-65359EE480FB"

BLECharacteristic *pCharacteristic;
bool deviceConnected = false;

// Setup callbacks onConnect and onDisconnect
class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };
    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

GTimer myTimer(MS);    // создать миллисекундный таймер
GTimer predictTimer(MS);         // 10 минут
#define __CS 17// Определяем пин к которому подключен разъем CS дисплея
#define __DC 2// Определяем пин к которому подключен разъем A0 дисплея
#define __RES 14 // Определяем пин к которому подключен разъем RESET дисплея
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
#include "MHZ19.h"
#define RX_PIN 32                                          // Rx pin which the MHZ19 Tx pin is attached to
#define TX_PIN 33                                          // Tx pin which the MHZ19 Rx pin is attached to
#define BAUDRATE 9600                                      // Device to MH-Z19 Serial baudrate (should not be changed)
MHZ19 myMHZ19;                                             // Constructor for library
SoftwareSerial mySerial(RX_PIN, TX_PIN);                   // create device to MH-Z19 serial



TFT_ILI9163C display = TFT_ILI9163C(__CS, __DC, __RES);// Связываем объект display с библиотекой TFT_ILI9163C и сообщаем библиотеке определенные для работы с дисплеем пины

// В следующих 8-и строках опеределяем названия и соответствующие им RGB обозначения цветов, которые будем выводить на дисплей
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
//uint8_t energy1 = 12;
float dispTemp;
byte dispHum;
int dispPres;
int dispCO2;
int dispRain;
uint16_t co2ppm;
uint32_t timer = 0;
int delta;
uint32_t pressure_array[6];
uint32_t sumX, sumY, sumX2, sumXY;
float a, b;
byte time_array[6];
uint8_t s = 1;
uint8_t s1 = 1;
int16_t ra = 0;
int16_t t[36];
int8_t th[36];
int16_t v[36];
int8_t vh[36];
int16_t p[36];
int16_t ph[36];
int16_t co[36];
int16_t coh[36];

// Начало функции обработки кириллических символов
String utf8rus(String source)     // Функция для конвертации русских символов из кодировки CP1251 в UTF8
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xBF) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB7;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}
// Конец функции обработки кириллических симоволов


static const uint32_t image_data_Start[16900] = {
}; //вступительная картинка

uint8_t x = 1;  //флаг переключения экранов
void basic(); //функция для экрана без данных
void sensor(); //функция для опроса датчиков
void tim(); //функция времени 10 минут для постойки графов
void after(); //второй экран с первичными данными
void graf(); //постройка графиков
void calc(); //рассчет массивов
void rain(); //рассчет вероятности дождя

void setup() {
  // Create the BLE Device
  BLEDevice::init("ESP32_Board");

  // Create the BLE Server
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a BLE Characteristic
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID_TX,
                      BLECharacteristic::PROPERTY_NOTIFY);

 

  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID_RX,
                                         BLECharacteristic::PROPERTY_WRITE);


  // Start the service
  pService->start();

  // Start advertising
  pServer->getAdvertising()->start();
  //pinMode(energy1, OUTPUT);
  //digitalWrite(energy1, HIGH);
  //  pinMode(energy2, OUTPUT);
  //  digitalWrite(energy2, HIGH);
  //  pinMode(batt, INPUT);
  display.begin();// Иницализируем дисплей
  display.writeScreen24(image_data_Start);
  bme.begin(0x76);
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                  Adafruit_BME280::SAMPLING_X1, // temperature
                  Adafruit_BME280::SAMPLING_X1, // pressure
                  Adafruit_BME280::SAMPLING_X1, // humidity
                  Adafruit_BME280::FILTER_OFF   );
  bme.takeForcedMeasurement();
  dispTemp = bme.readTemperature() - 2;
  dispHum = bme.readHumidity();
  dispPres = (float)bme.readPressure() * 0.00750062;
  mySerial.begin(BAUDRATE);                               // (Uno example) device to MH-Z19 serial start
  myMHZ19.begin(mySerial);                                // *Serial(Stream) refence must be passed to library begin().
  myMHZ19.autoCalibration(false);
  delay (5000);
  display.fillScreen(); // Очищаем дисплей перед выводом
  co2ppm = 500;
  dispRain = 1000;
  //Serial.begin(9600);
  //myMHZ19.printCommunication();
  uint32_t Pressure = bme.readPressure();
  for (byte i = 0; i < 6; i++) {   // счётчик от 0 до 5
    pressure_array[i] = Pressure;  // забить весь массив текущим давлением
    time_array[i] = i;             // забить массив времени числами 0 - 5
  }
}

void loop() {
  // put your main code here, to run repeatedly:


  //Serial.println(myMHZ19.getCO2());
  //Serial.println(myMHZ19.getTemperature()); // Request Temperature (as Celsius), new request = false;
 

    switch (x) {
      case 1: basic(); break;
      case 2: after(); break;
      case 3: tim(); break;
      case 4:
m:;
        if (myMHZ19.getCO2()  >= 2000) {
          goto m;
        }
        else {
          delay(15000);
        }
        sensor();
        calc();
        display.fillScreen(); // Очищаем дисплей перед выводом
        graf();
        after();
        x = 3;
        break;
    }

    if (deviceConnected) {
     /* std::string txString = boost::str(% dispTemp);
      txString += '/'
      txString += boost::str(dispHum);
      txString += '/'
      txString += boost::str(dispPres);
      txString += '/'
      txString += boost::str(co2ppm);
      txString += '/'
      txString += boost::str(dispRain);
      txString += '/'*/
    String txString =String(dispTemp)+'/'+String(dispHum)+'/'+String(dispPres)+'/'+String(co2ppm)+'/'+String(dispRain)+'/';
    pCharacteristic->setValue(txString);
    pCharacteristic->notify();
  }

  }
  void basic() {
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(60, 3);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Температура"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(20, 12);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Ожидание"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(70, 30);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Влажность"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(20, 39);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Ожидание"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(73, 57);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Давление"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(20, 66);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Ожидание"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(40, 85);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Углекислый газ"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(20, 94);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Ожидание"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(10, 115);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Шанс осадков"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(90, 115);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("В"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(110, 115);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print("%");  // Выводим строку на русском
    delay (2000);
    x = 2;

    for (byte i = 0; i < 36; i++) {   // счётчик от 0 до 36
      t[i] = 0;  // забить весь массив
      th[i] = 0;             // забить массив
      v[i] = 0;
      vh[i] = 0;
      p[i] = 0;
      ph[i] = 0;
      co[i] = 0;
      coh[i] = 0;
      if (x == 2) {
        x = 4;
      }
    }
  }

  void after() {


    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(60, 3);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Температура"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(50, 12);   // Устанавливаем курсор
    if (dispTemp <= 0) {
      display.setTextColor(CYAN);
    }
    if (dispTemp > 10) {
      display.setTextColor(BLUE);
    }
    if (dispTemp > 20) {
      display.setTextColor(GREEN);
    }
    if (dispTemp > 26) {
      display.setTextColor(YELLOW);
    }
    if (dispTemp > 30) {
      display.setTextColor(RED);
    }
    display.print(dispTemp);  //значение температуры
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(115, 20);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("\x80\C"));  //знак Цельсия
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(70, 30);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Влажность"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(85, 39);   // Устанавливаем курсор
    if (dispHum <= 20) {        //ГОСТ 30494-2011. Здания жилые и общественные. Параметры микроклимата в помещениях. СанПиН 2.2.4.3359-16 "Санитарно-эпидемиологические требования к физическим факторам на рабочих местах".

      display.setTextColor(RED);
    }
    if (dispHum > 20 && dispHum <= 40) {
      display.setTextColor(YELLOW);
    }
    if (dispHum > 40 && dispHum <= 60) {
      display.setTextColor(GREEN);
    }
    if (dispHum > 60 && dispHum <= 80) {
      display.setTextColor(YELLOW);
    }
    if (dispHum > 80 && dispHum <= 100) {
      display.setTextColor(RED);
    }
    display.print(dispHum);  // значение влажности
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(115, 46);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print("%");  // знак процента
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(73, 57);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Давление"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(50, 67);   // Устанавливаем курсор
    if (dispPres <= 740) {
      display.setTextColor(BLUE);
    }
    if (dispPres > 740 && dispPres <= 750) {
      display.setTextColor(CYAN);
    }
    if (dispPres > 750 && dispPres <= 760) {
      display.setTextColor(GREEN);
    }
    if (dispPres > 760 && dispPres <= 770) {
      display.setTextColor(YELLOW);
    }
    if (dispPres > 770) {
      display.setTextColor(RED);
    }
    display.print(dispPres);  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(95, 63);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("мм"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(95, 72);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("рт/ст"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(40, 85);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Углекислый газ"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(90, 95);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("частиц"));  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(90, 102);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("на мил"));  // Выводим строку на русском
    display.setTextSize(2);     // Определяем размер шрифта
    display.setCursor(43, 94);   // Устанавливаем курсор
    if (co2ppm <= 800) {
      display.setTextColor(GREEN);// Концентрация CO2 (ppm)стандарт ГОСТ 30494-2011
    }
    if (co2ppm > 800 && co2ppm <= 1400) {
      display.setTextColor(YELLOW);
    }
    if (co2ppm > 1400) {
      display.setTextColor(RED);
    }
    display.print(co2ppm);  // Выводим строку на русском
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(3, 115);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print(utf8rus("Шанс осадков"));  // Выводим строку на русском
    if (dispRain != 1000) {
      if (ra != dispRain) {
        display.fillRect(80, 113, 40, 15, BLACK);
        display.setTextSize(2);     // Определяем размер шрифта
        display.setCursor(80, 113);   // Устанавливаем курсор
        display.setTextColor(MAGENTA);   // Определяем цвет вывода на дисплей
        display.print(dispRain);  // процент вероятности дождя
        //display.print(-100);  // процент вероятности дождя
        ra = dispRain;
      }
    }
    display.setTextSize(1);     // Определяем размер шрифта
    display.setCursor(120, 115);   // Устанавливаем курсор
    display.setTextColor(WHITE);   // Определяем цвет вывода на дисплей
    display.print("%");  // Выводим строку на русском





  }

  void tim() {
    if (s == 1) {
      //myTimer.setTimeout(5000); //период обновления 20
      //predictTimer.setTimeout(5000); //период обновления 20
      myTimer.setTimeout(600000); //период обновления 10 минут
      predictTimer.setTimeout(600000); //период обновления 10 минут
      s = 2;
      s1 = 2;
    }
    sensor();


    if (myTimer.isReady() && s == 2) {
      sensor();
      calc();
      graf();
    }
    if (predictTimer.isReady() && s1 == 2) {
      rain();
      after();
    }
  }

  void graf() {
    display.fillRect(0, 11, 35, 19, BLACK);
    for (byte i = 0; i < 35; i++) {                   // счётчик от 0 до 35
      if (t[i] <= 1) {
        display.drawLine(i, 29 - th[i], i, 29, CYAN);
      }
      if (t[i] > 10) {
        display.drawLine(i, 29 - th[i], i, 29, BLUE);
      }
      if (t[i] > 20) {
        display.drawLine(i, 29 - th[i], i, 29, GREEN);
      }
      if (t[i] > 26) {
        display.drawLine(i, 29 - th[i], i, 29, YELLOW);
      }
      if (t[i] >= 30) {
        display.drawLine(i, 29 - th[i], i, 29, RED);
      }
    }
    display.fillRect(0, 38, 35, 19, BLACK);
    for (byte i = 0; i < 35; i++) {                   // счётчик от 0 до 35
      if (v[i] <= 20) {
        display.drawLine(i, 57 - vh[i], i, 57, RED);
      }
      if (v[i] > 20 && v[i] <= 40) {
        display.drawLine(i, 57 - vh[i], i, 57, YELLOW);
      }
      if (v[i] > 40 && v[i] <= 60) {
        display.drawLine(i, 57 - vh[i], i, 57, GREEN);
      }
      if (v[i] > 60 && v[i] <= 80) {
        display.drawLine(i, 57 - vh[i], i, 57, YELLOW);
      }
      if (v[i] > 80 && v[i] <= 100) {
        display.drawLine(i, 57 - vh[i], i, 57, RED);
      }
    }
    display.fillRect(0, 66, 35, 19, BLACK);
    for (byte i = 0; i < 35; i++) {                   // счётчик от 0 до 35
      if (p[i] <= 740) {
        display.drawLine(i, 85 - ph[i], i, 85, BLUE);
      }
      if (p[i] > 740 && p[i] <= 750) {
        display.drawLine(i, 85 - ph[i], i, 85, CYAN);
      }
      if (p[i] > 750 && p[i] <= 760) {
        display.drawLine(i, 85 - ph[i], i, 85, GREEN);
      }
      if (p[i] > 760 && p[i] <= 770) {
        display.drawLine(i, 85 - ph[i], i, 85, YELLOW);
      }
      if (p[i] > 770) {
        display.drawLine(i, 85 - ph[i], i, 85, RED);
      }
    }
    display.fillRect(0, 93, 35, 20, BLACK);
    for (byte i = 0; i < 35; i++) {                   // счётчик от 0 до 35
      if (co[i] <= 800) {
        display.drawLine(i, 112 - coh[i], i, 112, GREEN);
      }
      if (co[i] > 800 && v[i] <= 1400) {
        display.drawLine(i, 112 - coh[i], i, 112, YELLOW);
      }
      if (co[i] > 1400) {
        display.drawLine(i, 112 - coh[i], i, 112, RED);
      }
    }
  }

  void calc() {
    for (byte i = 0; i < 35; i++) {                   // счётчик от 0 до 35 (да, до 35. Так как 34 меньше 35)
      t[i] = t[i + 1];     // сдвинуть массив давлений КРОМЕ ПОСЛЕДНЕЙ ЯЧЕЙКИ на шаг назад
      v[i] = v[i + 1];
      p[i] = p[i + 1];
      co[i] = co[i + 1];
    }
    t[35] = dispTemp;                    // последний элемент массива теперь - нов
    v[35] = dispHum;
    p[35] = dispPres;
    co[35] = co2ppm;
    for (byte i = 0; i < 35; i++) {                   // счётчик от 0 до 35 (да, до 35. Так как 34 меньше 35)
      th[i] = t[i] / 2;
      vh[i] = v[i] / 5.21;
      ph[i] = p[i] - 630;
      ph[i] = ph[i] / 10;
      coh[i] = co[i] - 300;
      coh[i] = coh[i] / 89.5;
      if (th[i] < 0) {
        th[i] = 1;
      }
      if (vh[i] < 0) {
        vh[i] = 1;
      }
      if (ph[i] < 0) {
        ph[i] = 1;
      }
      if (coh[i] < 0) {
        coh[i] = 1;
      }
    }
    s = 1;
  }


  void sensor() {
    bme.takeForcedMeasurement();
    if (dispTemp + 2 > bme.readTemperature() + 0.25 || dispTemp + 2 < bme.readTemperature() - 0.25) {
      dispTemp = bme.readTemperature() - 2;
      display.fillRect(36, 11, 77, 19, BLACK);
    }
    if (float (dispHum) + 0.01 > bme.readHumidity() + 0.9 || float (dispHum) + 0.01 < bme.readHumidity() - 0.9) {
      dispHum = bme.readHumidity();
      display.fillRect(36, 38, 77, 19, BLACK);
    }
    if (float (dispPres) + 0.01 > ((float)bme.readPressure() * 0.00750062) + 0.9 || float (dispPres) + 0.01 < ((float)bme.readPressure() * 0.00750062) - 0.9) {
      dispPres = (float)bme.readPressure() * 0.00750062;
      display.fillRect(36, 66, 55, 19, BLACK);
    }
    if (co2ppm != myMHZ19.getCO2()) {
      if (co2ppm > 300 && co2ppm < 5000) {
        co2ppm = myMHZ19.getCO2();
        display.fillRect(36, 93, 53, 20, BLACK);
      }
    }
    if (x != 4) {
      after();
    }


  }


  void rain() {
    long averPress = 0;
    for (byte i = 0; i < 10; i++) {
      bme.takeForcedMeasurement();
      averPress += bme.readPressure();
      delay(1);
    }
    averPress /= 10;

    for (byte i = 0; i < 5; i++) {                   // счётчик от 0 до 5 (да, до 5. Так как 4 меньше 5)
      pressure_array[i] = pressure_array[i + 1];     // сдвинуть массив давлений КРОМЕ ПОСЛЕДНЕЙ ЯЧЕЙКИ на шаг назад
    }
    pressure_array[5] = averPress;                    // последний элемент массива теперь - новое давление
    sumX = 0;
    sumY = 0;
    sumX2 = 0;
    sumXY = 0;
    for (int i = 0; i < 6; i++) {                    // для всех элементов массива
      sumX += time_array[i];
      sumY += (long)pressure_array[i];
      sumX2 += time_array[i] * time_array[i];
      sumXY += (long)time_array[i] * pressure_array[i];
    }
    a = 0;
    a = (long)6 * sumXY;             // расчёт коэффициента наклона приямой
    a = a - (long)sumX * sumY;
    a = (float)a / (6 * sumX2 - sumX * sumX);
    delta = a * 6;      // расчёт изменения давления
    dispRain = map(delta, -250, 250, 100, -100);  // пересчитать в проценты
    s1 = 1;
  }

А вот расписанная ошибка:
Ошибка:
Arduino: 1.8.13 (Windows 7), Плата:"DOIT ESP32 DEVKIT V1, 80MHz, 921600, None"





















E:\перекинуть на диск\работа\датчик углекислого газа\Ver_1.0\Ver_1.0.ino: In function 'void loop()':

Ver_1.0:238:39: error: no matching function for call to 'BLECharacteristic::setValue(String&)'

In file included from C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLEServer.h:20:0,

                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLEDevice.h:18,

                 from E:\перекинуть на диск\работа\датчик углекислого газа\Ver_1.0\Ver_1.0.ino:6:

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:73:7: note: candidate: void BLECharacteristic::setValue(uint8_t*, size_t)

  void setValue(uint8_t* data, size_t size);

       ^

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:73:7: note:   candidate expects 2 arguments, 1 provided

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:74:7: note: candidate: void BLECharacteristic::setValue(std::__cxx11::string)

  void setValue(std::string value);

       ^

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:74:7: note:   no known conversion for argument 1 from 'String' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}'

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:75:7: note: candidate: void BLECharacteristic::setValue(uint16_t&)

  void setValue(uint16_t& data16);

       ^

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:75:7: note:   no known conversion for argument 1 from 'String' to 'uint16_t& {aka short unsigned int&}'

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:76:7: note: candidate: void BLECharacteristic::setValue(uint32_t&)

  void setValue(uint32_t& data32);

       ^

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:76:7: note:   no known conversion for argument 1 from 'String' to 'uint32_t& {aka unsigned int&}'

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:77:7: note: candidate: void BLECharacteristic::setValue(int&)

  void setValue(int& data32);

       ^

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:77:7: note:   no known conversion for argument 1 from 'String' to 'int&'

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:78:7: note: candidate: void BLECharacteristic::setValue(float&)

  void setValue(float& data32);

       ^

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:78:7: note:   no known conversion for argument 1 from 'String' to 'float&'

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:79:7: note: candidate: void BLECharacteristic::setValue(double&)

  void setValue(double& data64);

       ^

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BLE\src/BLECharacteristic.h:79:7: note:   no known conversion for argument 1 from 'String' to 'double&'

exit status 1

no matching function for call to 'BLECharacteristic::setValue(String&)'
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
@skynepdai, читайте внимательнее тот пример, откуда списывали. Использованный вами метод не работет с String, а только с char[]
 
  • Лойс +1
Реакции: Nikanor

skynepdai

✩✩✩✩✩✩✩
9 Мар 2020
19
0
@bort707,Я это видел, но далее он выполняет такую функцию: dtostrf(temperature, 1, 2, txString); А это как я вычитал, перевод числа с плавающей точкой в строку с сохранением этой точки

"Ничего не понимаю!" - Колобки
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
строки бывают разные
Клас String в ардуино - этосовсем не то, что строка char[] (массив типа char) в Си
Функция dtostrf и библиотека BLEServer.h работают с Си-шными строками, а вы им пытаетесь ардуиновский String подсунуть
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630

@skynepdai,
Почитайте про разницу между String (ардуино) и string C++..

Вообще-то у esp есть вот такая приколюха c_str().

Типа
String myString = "blablabla";

Function(myString.c_str()); //функция как аргумент принимает массив char
 
  • Лойс +1
Реакции: skynepdai

skynepdai

✩✩✩✩✩✩✩
9 Мар 2020
19
0
Всем большое спасибо что разъяснили о разности двух говяжьих котлет на разных тарелках :)
Буду разбираться