#1 2023-08-09 21:19:49

Maraseph
Учасник
Зареєстрований: 2023-08-09
Повідомлень: 1

Потрібна допомога з написанням коду для ADXL345 та HX711

Усім привіт!

Недавно розпочав вивчати ардуіно і потрібна допомога з програмуванням.
Мені необхідно, щоб отримані дані про положення відносно трьох вісей (x, y, z) з акселерометра ADXL345 та дані про вагу/навантаження з модуля HX711 (також під'єднаного до тензодатчиків) записувалися за допомогою Arduino Nano на SD-карточку (через модуль MicroSD Card Adapter). Можливо, щоб записувалися у форматі "csv".

Також хочу порадитися щодо правильності підключення модулів до Arduino Nano та живлення:
ADXL345:
VCC - 5V
GND - GND
SDA - A4
SCL - A5

HX711:
VCC - 5V
GND - GND
DT - D4
SCK - D5

MicroSD Card Adapter:
VCC - 5V
GND - GND
CS - D10
MOSI - D11
MISO - D12
SCK - D13

А також, чи буде усе працювати при підключенні 9V (батарейка крона) до пінів на ардуіно: плюс до VIN та мінус до GND.

Щось пробував писати скетч, і він компілюється, проте при завантаженні на ардуіно - нічого не відбуєваться:

   // Підключення усіх бібліотек:
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <HX711.h>

int ADXL345 = 0x53;

float Xa, Ya, Za;  

File dataFile;

const int LOADCELL_DOUT_PIN = 4;
const int LOADCELL_SCK_PIN = 5;

HX711 scale;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  
  Wire.beginTransmission(ADXL345);    // Початок комунікації із сенсором
  Wire.write(0x2D);                   // Звернення до регістру POWER_CTL - 0x2D
  
  Wire.write(8);                      // (8dec -> 0000 1000 binary) біт D3 високий логічний сигнал
  Wire.endTransmission();
  delay(10);

  // Ініціалізація microSD
  if (!SD.begin(10)) {  
    Serial.println("SD card initialization failed!");
    while (1);
  }

  // Створення файлу "log.csv" для запису
  dataFile = SD.open("log.csv", FILE_WRITE);
  if (dataFile) {
    dataFile.println("ADXL345_X,ADXL345_Y,ADXL345_Z,HX711");
    dataFile.close();
  }

  // Ініціалізація HX711 модуля
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale();
}

void loop() {

  // === Зчитування даних модуля ADXL345  === //
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32);                         // Початок з регістру 0x32 (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true);       // Загалом зчитування 6-ти регістрів
  Xa = ( Wire.read()| Wire.read() << 8);    // Значення по вісі Х
  Xa = Xa / 256;                            // Для діапазону значень +-2g, потрібно поділити значення на 256
  Ya = ( Wire.read()| Wire.read() << 8);    // Значення по вісі Y
  Ya = Ya / 256;
  Za = ( Wire.read()| Wire.read() << 8);    // Значення по вісі Z
  Za = Za / 256;
  Serial.print("Xa= ");
  Serial.print(Xa);
  Serial.print("   Ya= ");
  Serial.print(Ya);
  Serial.print("   Za= ");
  Serial.println(Za);
  

  // Отримання даних ваги з HX711
  long hx711Value = scale.read_average();
  Serial.print("  HX711: ");
  Serial.println(hx711Value);

  // Відкриття файлу "log.csv" для запису
  dataFile = SD.open("log.csv", FILE_WRITE);
  if (dataFile) {
    // Запис даних з ADXL345 та HX711 у файл
    dataFile.print(Xa);
    dataFile.print(",");
    dataFile.print(Ya);
    dataFile.print(",");
    dataFile.print(Za);
    dataFile.print(",");
    dataFile.println(hx711Value);
    dataFile.close();
  }
  else {
    Serial.println("Error opening log.csv file!");
  }
  // Затримка
  delay(500);
}

Заздалегідь дякую за допомогу!

Неактивний

#2 2023-08-09 22:09:12

Васятко
Гість

Re: Потрібна допомога з написанням коду для ADXL345 та HX711

Maraseph пише:

чи буде усе працювати при підключенні 9V (батарейка крона) до пінів на ардуіно: плюс до VIN та мінус до GND.

Буде, але не довго

#3 2023-08-11 00:30:27

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Потрібна допомога з написанням коду для ADXL345 та HX711

Давно не розробляю під Ардуіно, але..
Я би так зробив:
Взяв один пристрій (датчик). Почитав на нього даташит. Розібрався з його роботою. Спробував підключити та отримати якісь дані. З ардуіно тяжко без відладчика. Тому активно використовував би відладку через вбудований uart. Покроково. Дійшов до цієї точки, - повідомлення в uart з якимось даними.
Всі нові можливості(функції) вводив поступово, з перевіркою чи не рухнуло все. З часом код захламляється, тому деякі функції можна згрупувати та винести в окремий файл.
Далі інший датчик так само.
І на закуску робота з sd картою.
Не намагайтесь запихнути все в loop()
Поділіть на прості функції, в яких розберетесь ви і той, хто буде потім читати ваш код.

Наприклад початок програми:
Інклюди
Дефайни

Глобальні змінні, якщо треба

Serial_init();
Sensor sensor1;//створюємо датчик
sensor1.init();//якась ініціалізація
Sensor sensor2;
sensor2.init;
SDcard sdcard;
sdcard.init();

loop(){
sensor1.handle();//обробляємо дані датчика
sensor2.handle();
sdcard.handle(sensor1, sensor2);//записуємо
delay(500);
}
Що до живлення від 9в, подивіться який стабілізатор стоїть на вашій платі. Потім знайдіть його даташит і стане все зрозуміло.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму