#include <Wire.h>
#include <SPI.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <ADXL345.h>
// OLED display TWI address
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
ADXL345 adxl; // variable adxl is an instance of the ADXL345 library
const int buttonPin1 = 2; // Chord depth increase
int buttonState1 = 0; // variable for reading the pushbutton status
const int buttonPin2 = 4; // Zero angle and throw
int buttonState2 = 0; // variable for reading the pushbutton status
int count = 1; // Start chord depth [mm]
int x, y, z;
float xg, yg, zg;
float soh;
float tilt;
int angle;
float rad;
int up; // 1 -> up, 2 -> down
int relative; // for zeroing
//uint16_t degree[8] = {140, 146, 146, 140, 128, 128, 128, 128}; // °
//uint16_t arrowup[8] = {132, 142, 132, 132, 132, 128, 128, 128}; // Arrow up
//uint16_t arrowdown[8] = {128, 128, 128, 132, 132, 132, 142, 132,}; // Arrow down
void setup() {
// initialize and clear display
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
// display a pixel in each corner of the screen
//display.drawPixel(0, 0, WHITE); //links oben
//display.drawPixel(127, 0, WHITE); //rechts oben
//display.drawPixel(0, 63, WHITE); //links unten
// display.drawPixel(127, 63, WHITE); //rechts unten
}
void loop() {
// display text
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(15,20);
display.println("RC-Meter");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20,40);
display.println("Winkel & Weg");
delay(1000);
display.display();
// read the state of the pushbutton value:
buttonState1 = digitalRead(buttonPin1);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState1 == HIGH) {
count = count + 1;
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (0, 0); // oben links
display.clearDisplay();
display.println("Rudertiefe:");
display.display();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (70, 0);
display.println(count);
display.display();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (90, 0);
display.println("mm");
display.display();
delay(100);
}
else {
// read the state of the pushbutton value:
buttonState2 = digitalRead(buttonPin2);
// check if the pushbutton is pressed.
// if it is, the buttonState2 is HIGH:
if (buttonState2 == HIGH) {
relative = angle;
}
adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables x,y,z
xg = x * 0.0039;
yg = y * 0.0039;
zg = z * 0.0039;
soh = yg / zg;
tilt = atan(soh) * 57.296;
angle = int(tilt) * -1;
display.setCursor (50, 20);
display.clearDisplay();
display.display();
if ((angle - relative) > 0) {
up = 1;
}
else {
up = 2;
}
if ((angle - relative) == 0) {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (10, 0);
display.println("Winkel:");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (70, 0);
display.println(abs(angle - relative));display.write(byte(0));
display.display();
}
else {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (0, 0);
display.println("Winkel:");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (85, 0);
display.println(abs(angle - relative));
display.write(byte(0));
display.write(byte(up));
display.display();
}
rad = abs(angle - relative) * 0.017453;
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (0, 30);
display.println("Weg:");display.print(int(count * sin(rad)));
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (65, 30);
display.println("mm");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (80, 30);
display.println(" (");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (10, 30);
display.println(count);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor (110, 30);
display.println(")");
display.display();
delay(100);
}
}