Запись данных в файл с акселерометра на ESP32+ADXL103

Уже отвечал выше.

миллис считает по 1 мс, соответственно быстрее 1 КГц на нем не получить

1 лайк

да и те рваные,так что только на таймере делать задержку

1 лайк

Ну т.е. примерно 200к данных.
Мне кажется, SD - не лучшее решение, когда нужна высокая скорость записи. А тем более - если нужно гарантированное время, в течение которого эта запись осуществится. ФС, да еще и допускающая фрагментацию, дает очень большой разброс в продолжительности процесса записи.
Я бы посоветовал что-то вроде ESP-PSRAM64 - микросхема емкостью 8 Мбайт, подключаемая по SPI.
Работать с ней намного проще, чем с SD, поместится на нее до 4 млн двухбайтовых записей, чего, судя по всему, Вам вполне достаточно. Но самое главное - цикл записи или чтения имеет гарантированную продолжительность, не подверженную разбросу. И, кстати, этот вид памяти не подвержен износу, что характерно для flash-памяти, используемой в SD.

и нажатием кнопки слить все данные в SQL, а вот с базой можно делать всё что хочешь

У меня модуль esp32 16MB, spiffs на ней. Я не знаю, как по другому использовать эту память.

Я советую, если есть возможность, на первом этапе использовать проводной COM порт. Со скоростью 115200 не должно быть проблем ни на передающей ни на приемной стороне. Если передавать байтами, по 2 байта на отсчет, то для 5КГц хватит. Когда определитесь с алгоритмом обработки и опробуете его для разных скоростей и т.д. тогда посчитаете точнее, какая реально нужна скорость при прямой передаче, или какой буфер записывать и как часто его передавать и т.д.

1 лайк

У Вас какая цель, решить задачу или использовать конкретный вид памяти?

кстати есть модули с PSRAM но поскромнее, а себе заказывал с дисплеем 4.3", залитый тестовый скетч показывает 66 fps via SPI

1 лайк

Доброго времени суток!
Все попытки получать сначала сохранять данные, а потом передавать не дали желаемого результата.
Не знаю, как правильно сделать, создавать новую тему или лучше продолжить здесь.
Надо так:

  1. из приложения (с телефона или компьютера) отсылаю команду на сбор данных,
  2. когда данных достаточно из приложения останавливаю сбор данных.
    Чтобы так сделать, наверное, нужно использовать FreeRTOS. Для меня это совсем космос.
    Нашел пример c BLE Service
    [ESP32:Примеры/Android-приложение, коммуницирующее через BLE: управление выходными контактами и показ данных, считанных датчиком / Онлайн справочник - wikihandbk.com]
    Пытаюсь сделать, чтобы по команде из приложения (1), ESP32 возвращала данные.
    Пожалуйста, помогите.
#include <BLEServer.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#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;

// функции обратного вызова, которые будут запускаться при подключении и отключении BLE-клиента от BLE-сервера:
class MyServerCallbacks: public BLEServerCallbacks
{
  void onConnect(BLEServer* pServer) 
  {
    deviceConnected = true;
  };
  void onDisconnect(BLEServer* pServer)
  {
    deviceConnected = false;
  }
};

// функция обратного вызова, которая будет запускаться при получении нового значения от Android-приложения:
class MyCallbacks: public BLECharacteristicCallbacks 
{
  void onWrite(BLECharacteristic *pCharacteristic) 
  {  std::int rxValue = pCharacteristic->getValue();
     if(rxValue == 1) 
	 { 
       for (i=0; i<1024; i++)
	   {
		   // задаем новое значение для характеристики:
		   pCharacteristic->setValue(AnalogRead(34));
           // отправляем значение Android-приложению:
           pCharacteristic->notify(); 
		   delaymicroseconds(200);
	   }   
     }
  }
};

void setup() {
  // создаем BLE-устройство:
  BLEDevice::init("ACC_BT");

  // создаем BLE-сервер:
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Создаем BLE-сервис:
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Создаем BLE-характеристику:
  pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX,BLECharacteristic::PROPERTY_NOTIFY);
  pCharacteristic->addDescriptor(new BLE2902());

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

  // Запускаем сервис:
  pService->start();

  // Начинаем рассылку оповещений:
  pServer->getAdvertising()->start();
}

void loop()
{};

Код вставлен не верно. Обрамлять нужно тем, что расположено на кнопке «ё» на клавиатуре компьютера.

Спасибо! Туплю после праздников.