Всем привет! Сделала по шине i2c чтение по трем осям акселерометра. Теперь появилась задача добавить реакцию на удар и на падение. Нужно ли как-то подключать оставшиеся 2 выхода? Или придется использовать целиком иную схему? Подключено сейчас схеме с картинки. Код: Код (C++): #include <Servo.h> #include <Wire.h> //акселерометр #define DEVICE (0x53) // Адрес ADXL345 на шине - 0x53 #define TO_READ (6) // размер буфера, количество байтов которые мы будем читать одновременно(2 байта на каждую ось X Y Z) byte buff[TO_READ] ; // буфер для хранения считываемых с акселерометра данных, максимум char str[512]; //строковый буфер чтобы конвертировать данные перед посыланием на монитора порта //Здесь смысл такой, что первый байт после начала передачи это всегда адрес регистра, в который мы хотим что-то записать, //а второй байт его значение, далее обязательно завершить передачу. //Если мы хотим получить данные, то принцип общения похож, но главное отличие что в ответ мы можем получить не 1 байт, а несколько. void readFrom(int device, byte address, int num, byte buff[]) { Wire.beginTransmission(device); //Начало передачи I2C для ведомого устройства (слейва) с заданным адресом. Затем, нужно вызвать метод write() //для добавления последовательности байт в очередь предназначенных для передачи, и выполнить саму передачу данных методом endTransmission(). Wire.write(address); //Записывает данные от ведомого устройства (слейва) в ответ на запрос мастера, или записывает очередь байт для передачи от мастера //к ведомому устройству (в промежутках между вызовами beginTransmission() и endTransmission()). Wire.endTransmission(); //Завершает передачу данных для ведомого устройства(слейва), которое было начато beginTransmission() //и, фактически, осуществляет перечу байт, которые были поставлены в очередь методом write(). Wire.beginTransmission(device); //опять начинает. так надо Wire.requestFrom(device, num); //Запрос 6 байт от слейва-нашего девайса. (Этот метод используется мастером для запроса байта от ведомого устройства (слейва). //Байты могут быть получены с помощью методов available() и read().) int i = 0; while(Wire.available()) // пока есть, что читать { buff[i] = Wire.read(); // получаем байт (как символ) i++; } Wire.endTransmission(); // передача данных } //функция для передачи настроек void writeTo(int device, byte address, byte val) { Wire.beginTransmission(device); Wire.write(address); Wire.write(val); Wire.endTransmission(); // передача данных } void setup() { //инициализация устройства Wire.begin(); // подключение к шине i2c Serial.begin(9600); // start serial for output //Для включения нашего ADXL345 необходимо 3 раза поменять значения регистра 0x2D, отвечающего за питание устройства. //Т.е. сперва выключить устройство, затем включено, но в standby (AUTO_SLEEP) и только потом включить (Measure). //Turning on the ADXL345 writeTo(DEVICE, 0x2D, 0); writeTo(DEVICE, 0x2D, 16); writeTo(DEVICE, 0x2D, 8); } void loop() { //Читаем из адреса regAddress = 0x32 и получаем в буфер 6 байт, где 3 раза по 10 бит //(ну вот такое там разрешение, всегда 10 бит), поэтому надо разобрать каждое значение из //2-х байт, передать, что получили на комп, небольшая задержка и по новой. int regAddress = 0x32; //адрес регистра данных ADXL345 int x, y, z; readFrom(DEVICE, regAddress, TO_READ, buff); //читаем данные с ADXL345 //каждой оси значение 2 байта //таким образом мы превращаем оба байта в один int x = (((int)buff[1]) << 8) | buff[0]; y = (((int)buff[3])<< 8) | buff[2]; z = (((int)buff[5]) << 8) | buff[4]; //пишем значения по трём осям в монитор порта sprintf(str, "%d %d %d", x, y, z); Serial.print(str); Serial.write(10); //Похоже, что задержка необходима для того, чтобы не засорять порт //delay(1450); }