Håller på med ett litet projekt att göra en trim level mätare till min båt.
Denna har funkat som den ska tidigare men nu vill det inte riktigt funka längre, eller jo den funkar men visar lite konstigt på oled displayen, jag har testat med både arduino Uno, och Nano (flera olika varianter) men samma resultat varje gång, oled displayen är en Digole display http://www.ebay.com/itm/1-3-Serial-UART ... 5679dc17ec
Det är i botten bara en enkel potentiometer som ger värdet till stapeln, potten är på ca 100ohm, och likaså motståndet, men jag tror inte det har med saken att göra
Så här blir det nu när jag kör den (den vill inte visa hela stapeln och dessutom delar av den på mitten)
https://www.youtube.com/watch?v=GDFs-An ... e=youtu.be
Koden jag har är denna
Kod: Markera allt
#define _Digole_Serial_UART_
#include <DigoleSerial.h>
DigoleSerialDisp mydisp(&Serial, 9600);
#include <Wire.h>
const unsigned char welcomeimage[] PROGMEM = {
0, 0, 0, 0, 0, 127
, 0, 8, 1, 2, 0, 127
, 0, 8, 0, 148, 0, 127
, 0, 16, 0, 89, 112, 127
, 3, 144, 0, 16, 144, 127
, 28, 145, 192, 16, 144, 127
, 1, 30, 128, 80, 144, 127
, 9, 49, 3, 208, 144, 127
, 5, 72, 0, 80, 144, 127
, 2, 72, 0, 150, 144, 127
, 3, 8, 0, 152, 208, 127
, 5, 24, 0, 64, 160, 127
, 4, 148, 0, 64, 128, 127
, 8, 36, 0, 128, 128, 127
, 16, 34, 3, 240, 128, 127
, 32, 65, 0, 14, 0, 127
, 0, 129, 128, 1, 252, 127
, 3, 0, 64, 0, 0, 127
, 0, 0, 0, 0, 0, 127
, 0, 0, 0, 0, 0, 127
, 0, 0, 0, 0, 0, 127
};
const unsigned char trimImage[1024] PROGMEM = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0
,0,0,31,243,254,132,79,249,255,63,239,249,63,240,0,0
,0,0,16,18,2,132,72,9,0,32,8,1,33,16,0,0
,0,0,16,18,2,132,72,9,0,32,8,1,33,16,0,0
,0,0,16,18,2,132,79,249,0,32,8,1,33,16,0,0
,0,0,16,18,2,132,72,1,0,32,8,1,33,16,0,0
,0,0,31,243,254,255,207,249,0,63,232,1,33,16,0,0
,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,63,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
,63,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0
,32,47,248,0,0,0,0,0,0,0,0,0,0,63,231,252
,32,40,8,0,0,0,0,0,0,0,0,0,0,32,36,4
,32,40,8,0,0,0,0,0,0,0,0,0,0,32,36,4
,32,40,8,0,0,0,0,0,0,0,0,0,0,32,36,4
,32,40,8,0,0,0,0,0,0,0,0,0,0,32,36,4
,63,239,248,0,0,0,0,0,0,0,0,0,0,63,228,4
,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
const float SENSOR_LOW = 0;
const float SENSOR_MID = 250;
const float SENSOR_HIGH = 500;
const float THRESHOLD = 2;
float prevTrim = 0;
void setup() {
mydisp.begin();
delay(5000);
mydisp.clearScreen();
//mydisp.displayConfig(0);
mydisp.disableCursor();
mydisp.setPrintPos(3, 2, _TEXT_);
mydisp.setFont(200);
mydisp.print("WARNING!");
delay(500);
mydisp.clearScreen();
delay(500);
mydisp.setPrintPos(3, 2, _TEXT_);
mydisp.setFont(200);
mydisp.print("WARNING!");
delay(500);
mydisp.clearScreen();
delay(500);
mydisp.setPrintPos(3, 2, _TEXT_);
mydisp.setFont(200);
mydisp.print("WARNING!");
delay(500);
mydisp.clearScreen();
delay(500);
mydisp.setPrintPos(3, 2, _TEXT_);
mydisp.setFont(200);
mydisp.print("WARNING!");
delay(5000);
mydisp.clearScreen();
mydisp.setPrintPos(0, 1, _TEXT_);
mydisp.print(" USE ENGINE FAN BEFORE START");
delay(5000);
mydisp.clearScreen();
delay(200);
mydisp.drawBitmap(0, 0, 128, 64, trimImage);
delay(200);
}
void loop() {
int sensorValue = analogRead(A0);
//Serial.println(sensorValue, DEC);
setTrim(sensorValue);
delay(40);
}
void setTrim(float value) {
const float BAR_WIDTH = 122.0f;
const float HALF_BAR_WIDTH = 61.0f;
float trim;
if (value < SENSOR_MID) {
trim = (value - SENSOR_LOW) / (SENSOR_MID - SENSOR_LOW) * HALF_BAR_WIDTH;
} else {
trim = (value - SENSOR_MID) / (SENSOR_HIGH - SENSOR_MID) * HALF_BAR_WIDTH + HALF_BAR_WIDTH;
}
if (trim < 1.0f) {
trim = 0.0f;
} else if (trim > BAR_WIDTH) {
trim = BAR_WIDTH;
}
float diff = trim - prevTrim;
if (diff > THRESHOLD || diff < (-THRESHOLD)) {
prevTrim = trim;
}
int invertedTrim = (int)(BAR_WIDTH - prevTrim);
mydisp.setColor(0);
mydisp.drawBox(2, 30, (int)BAR_WIDTH , 8);
mydisp.setColor(1);
mydisp.drawBox(2, 30, invertedTrim, 8);
}