В некоторых проектах, особенно в мобильных, с использованием каких-либо дисплеев и экранов зачастую нужно реализовать поворот изображения в соответствии с положением дисплея относительно плоскости земли. Это вполне легко можно реализовать с помощью акселерометра, который будет определять вектор свободного падения, а все данные будут обрабатываться в микроконтроллере.

В данном случае в качестве акселерометра мы использовали ADXL345, а в качестве микроконтроллерной платы взяли плату Arduino Nano. В роли дисплея была задействована светодиодная матрица 8x8 с драйвером MAXX7219.
Все было собрано на монтажной плате и выглядело так:

Схема данной платы:

Код программы для Arduino следующий:
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#include <LedControl.h>
#define PIN_DATAIN 11
#define PIN_CLK 13
#define PIN_LOAD 10
LedControl lc = LedControl(PIN_DATAIN, PIN_CLK, PIN_LOAD, 1);
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
#define zero_x 1.569
#define zero_y 1.569
#define zero_z 1.569
void setup(void)
{
#ifndef ESP8266
while (!Serial);
#endif
Serial.begin(9600);
Serial.println("Accelerometer Test"); Serial.println("");
if(!accel.begin())
{
Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
while(1);
}
//accel.setRange(ADXL345_RANGE_16_G);
// accel.setRange(ADXL345_RANGE_8_G);
// accel.setRange(ADXL345_RANGE_4_G);
accel.setRange(ADXL345_RANGE_2_G);
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}
void loop(void)
{
sensors_event_t event;
accel.getEvent(&event);
float xv;
float yv;
float zv;
xv=(event.acceleration.x-zero_x);
yv=(event.acceleration.y-zero_y);
zv=(event.acceleration.z-zero_z);
if ((abs(zv) < 4.9) && (xv > 4.9) && (abs(yv) < 3.9)) {rotate_display('t');}
if ((abs(zv) < 4.9) && (xv < -4.9) && (abs(yv) < 3.9)) {rotate_display('b');}
if ((abs(zv) < 4.9) && (yv > 4.9) && (abs(xv) < 3.9)) {rotate_display('r');}
if ((abs(zv) < 4.9) && (yv < -4.9) && (abs(xv) < 3.9)) {rotate_display('l');}
delay(1000);
}
void rotate_display(char my_direction)
{
lc.clearDisplay(0);
switch(my_direction){
case 't':lc.setLed(0,7,4,true);lc.setLed(0,6,3,true);lc.setLed(0,6,5,true);break;//
case 'b':lc.setLed(0,0,4,true);lc.setLed(0,1,3,true);lc.setLed(0,1,5,true);break;//
case 'r':lc.setLed(0,4,7,true);lc.setLed(0,3,6,true);lc.setLed(0,5,6,true);break;///
case 'l':lc.setLed(0,4,0,true);lc.setLed(0,3,1,true);lc.setLed(0,5,1,true);break;//
}
}
© digitrode.ru