Initial import
This commit is contained in:
215
code/src/main.cpp
Normal file
215
code/src/main.cpp
Normal file
@@ -0,0 +1,215 @@
|
||||
#include <Arduino.h>
|
||||
#include <EEPROM.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
#include <Adafruit_VL53L1X.h>
|
||||
#include "main.h"
|
||||
|
||||
uint16_t offset = 0;
|
||||
uint16_t height = 0;
|
||||
uint16_t measurement = 0;
|
||||
uint16_t oldMeasurement = 0;
|
||||
int16_t delta = 0;
|
||||
bool updateScreen = 1;
|
||||
|
||||
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, SCREEN_RESET);
|
||||
Adafruit_VL53L1X vl53 = Adafruit_VL53L1X(XSHUT_PIN, IRQ_PIN);
|
||||
|
||||
void setup() {
|
||||
pinMode(RE_CLK, INPUT_PULLUP);
|
||||
pinMode(RE_DATA, INPUT_PULLUP);
|
||||
pinMode(RE_PRESS, INPUT_PULLUP);
|
||||
pinMode(LED1, OUTPUT);
|
||||
pinMode(LED2, OUTPUT);
|
||||
pinMode(LED3, OUTPUT);
|
||||
|
||||
TWBR = 2; // force i2c clock freq to 400kHz
|
||||
|
||||
digitalWrite(LED1, 1);
|
||||
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
|
||||
while (1) delay(10);
|
||||
}
|
||||
display.clearDisplay();
|
||||
|
||||
digitalWrite(LED2, 1);
|
||||
if (! vl53.begin(0x29, &Wire)) {
|
||||
while (1) delay(10);
|
||||
}
|
||||
|
||||
if (! vl53.startRanging()) {
|
||||
while (1) delay(10);
|
||||
}
|
||||
vl53.setTimingBudget(500);
|
||||
|
||||
digitalWrite(LED3, 1);
|
||||
EEPROM.get(EEPROM_ADDRESS, offset);
|
||||
|
||||
digitalWrite(LED1, 0);
|
||||
digitalWrite(LED2, 0);
|
||||
digitalWrite(LED3, 0);
|
||||
|
||||
startLoopDisplay();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
if (updateScreen) { // only ypdate the screen on changes
|
||||
updateScreen = 0;
|
||||
updateLoopDisplay();
|
||||
}
|
||||
|
||||
if (vl53.dataReady()) {
|
||||
measurement = vl53.distance();
|
||||
vl53.clearInterrupt();
|
||||
if (measurement != oldMeasurement) {
|
||||
oldMeasurement = measurement;
|
||||
updateScreen = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (digitalRead(RE_CLK) == 0) { // turn the rotary encoder
|
||||
if (digitalRead(RE_DATA) == 0) { // turn right
|
||||
if (height < 999) {
|
||||
height++;
|
||||
}
|
||||
} else { // turn left
|
||||
if (height > 0) {
|
||||
height--;
|
||||
}
|
||||
}
|
||||
updateScreen = 1;
|
||||
|
||||
while (digitalRead(RE_CLK) == 0) {} // wait till encoder has rotated
|
||||
}
|
||||
|
||||
if (digitalRead(RE_PRESS) == 0) {
|
||||
while (digitalRead(RE_PRESS) == 0) {} // wait till button is released
|
||||
config();
|
||||
}
|
||||
}
|
||||
|
||||
void config() {
|
||||
bool doneConfig = 0;
|
||||
bool calibrate = 0;
|
||||
|
||||
startConfigDisplay();
|
||||
updateConfigDisplay(calibrate);
|
||||
|
||||
while (!doneConfig) {
|
||||
if (updateScreen) {
|
||||
updateScreen = 0;
|
||||
updateConfigDisplay(calibrate);
|
||||
}
|
||||
|
||||
if (digitalRead(RE_CLK) == 0) { // turn the rotary encoder
|
||||
if (digitalRead(RE_DATA) == 0) { // turn right
|
||||
calibrate = 0;
|
||||
digitalWrite(LED2, 1);
|
||||
} else { // turn left
|
||||
calibrate = 1;
|
||||
digitalWrite(LED1, 1);
|
||||
}
|
||||
updateScreen = 1;
|
||||
|
||||
while (digitalRead(RE_CLK) == 0) {} // wait till encoder has rotated
|
||||
digitalWrite(LED2, 0);
|
||||
digitalWrite(LED1, 0);
|
||||
}
|
||||
|
||||
if (digitalRead(RE_PRESS) == 0) {
|
||||
digitalWrite(LED3, 1);
|
||||
|
||||
if (calibrate) {
|
||||
while (!vl53.dataReady()) {
|
||||
delay(10);
|
||||
}
|
||||
offset = vl53.distance();
|
||||
vl53.clearInterrupt();
|
||||
EEPROM.put(EEPROM_ADDRESS, offset);
|
||||
}
|
||||
doneConfig = 1;
|
||||
while (digitalRead(RE_PRESS) == 0) {} // wait till button is released
|
||||
digitalWrite(LED3, 0);
|
||||
}
|
||||
}
|
||||
startLoopDisplay();
|
||||
updateScreen = 1;
|
||||
}
|
||||
|
||||
void startLoopDisplay() {
|
||||
display.clearDisplay();
|
||||
display.setTextColor(1, 0);
|
||||
display.setTextSize(2);
|
||||
display.setFont(NULL);
|
||||
|
||||
display.drawLine(73, 0, 73, 32, 1);
|
||||
display.display();
|
||||
}
|
||||
|
||||
void updateLoopDisplay() {
|
||||
char buffer[5];
|
||||
|
||||
display.fillRect(4, 5, 19, 22, 0);
|
||||
if (measurement < (height + offset)) {
|
||||
display.fillRoundRect(11, 6, 5, 19, 3, 1);
|
||||
display.fillTriangle(4, 14, 22, 14, 13, 5, 1);
|
||||
}
|
||||
if (measurement == (height + offset)) {
|
||||
// display.fillRoundRect(4, 13, 18, 5, 3, 1);
|
||||
}
|
||||
if (measurement > (height + offset)) {
|
||||
display.fillRoundRect(11, 6, 5, 19, 3, 1);
|
||||
display.fillTriangle(4, 17, 22, 17, 13, 26, 1);
|
||||
}
|
||||
|
||||
delta = measurement - (height + offset);
|
||||
if (delta < 0) { delta = -delta; }
|
||||
if (delta > 999) { delta = 999; }
|
||||
sprintf(buffer,"%3d", delta);
|
||||
display.setCursor(30, 9);
|
||||
display.print(buffer);
|
||||
|
||||
sprintf(buffer,"%3d", height);
|
||||
display.setCursor(84, 9);
|
||||
display.print(buffer);
|
||||
|
||||
display.display();
|
||||
}
|
||||
|
||||
void startConfigDisplay() {
|
||||
display.clearDisplay();
|
||||
display.setTextColor(1, 0);
|
||||
display.setTextSize(1);
|
||||
display.setFont(NULL);
|
||||
|
||||
display.setCursor(16, 2);
|
||||
display.print(F("Calibrate offset"));
|
||||
|
||||
display.drawLine(0, 12, 127, 12, 1);
|
||||
|
||||
display.setTextSize(2);
|
||||
display.setCursor(64, 16);
|
||||
display.print("/");
|
||||
|
||||
display.display();
|
||||
}
|
||||
|
||||
void updateConfigDisplay(bool calibrate) {
|
||||
if (calibrate) {
|
||||
display.setCursor(16, 16);
|
||||
display.setTextColor(0, 1);
|
||||
display.print("YES");
|
||||
display.setCursor(90, 16);
|
||||
display.setTextColor(1, 0);
|
||||
display.print("NO");
|
||||
} else {
|
||||
display.setCursor(16, 16);
|
||||
display.setTextColor(1, 0);
|
||||
display.print("YES");
|
||||
display.setCursor(90, 16);
|
||||
display.setTextColor(0, 1);
|
||||
display.print("NO");
|
||||
}
|
||||
display.display();
|
||||
}
|
||||
36
code/src/main.h
Normal file
36
code/src/main.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef _MAIN_H_
|
||||
#define _MAIN_H_
|
||||
|
||||
//#define TWI_FREQ 400L
|
||||
|
||||
#define SCREEN_ADDRESS 0x3C // < See datasheet for Address; 0x3D for 128x64, 0x3D for 128x32
|
||||
#define SCREEN_WIDTH 128
|
||||
#define SCREEN_HEIGHT 32
|
||||
#define SCREEN_RESET -1
|
||||
#define SCREEN_ROTATION 0
|
||||
|
||||
// VL53L1X related
|
||||
#define XSHUT_PIN 1
|
||||
#define IRQ_PIN 0
|
||||
|
||||
// Rotary Encoder related
|
||||
#define RE_CLK 7
|
||||
#define RE_DATA 6
|
||||
#define RE_PRESS 5
|
||||
|
||||
#define LED1 16
|
||||
#define LED2 15
|
||||
#define LED3 14
|
||||
|
||||
// EEPROM related
|
||||
#define EEPROM_ADDRESS 0
|
||||
|
||||
void config();
|
||||
|
||||
void startLoopDisplay();
|
||||
void updateLoopDisplay();
|
||||
void startConfigDisplay();
|
||||
void updateConfigDisplay(bool calibrate);
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user