Hallo allemaal,
Ik ben Rik, 38 jaar en bezig met een dashboard project. Daarbij wil ik een DS18B20 gebruiken als probe om de koelwater temperatuur uit te lezen en weer te geven op een SPI OLED op het dashboard.
Het initiele plan was om de "onboard" sensor van de auto te gebruiken, echter ben ik van dit plan afgeweken. De onboard sensor is er een waarbij de weerstand op-/afloopt al naar gelang de temperatuur. Hierop is ook mijn (deels geleende) sketch afgestemd. Nu ik de DS18B20 wil gebruiken, gaat volgens mij de map functie niet meer op, waardoor ik de juiste waarde niet weer kan geven op de dial op de OLED.
Onderstaand de sketch:
/////////////////////////////////////////////////////////////////
// Arduino OLED VW Jetta Digidash V.1 //
// Design and coding: R. Spijkers //
// 19-1-2021 //
/////////////////////////////////////////////////////////////////
#include "U8glib.h"
// pins on the Arduino
#define OLED_SCK 13
#define OLED_MOSI 11
#define OLED_CS 10
#define OLED_DC 7
#define OLED_RES 8
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
// U8GLIB constructor OLED display
U8GLIB_SSD1306_128X64 u8g(OLED_SCK, OLED_MOSI, OLED_CS, OLED_DC, OLED_RES);
int frame = 0;
int xmax=128; // max length x-axis
int ymax=62; // max length y-axis
int xcenter=xmax/2; // center of x-axis
int ycenter=ymax/2+10; // center of y-axis
int arc=ymax/2;
int angle=0;
char* label[] = {"LOAD","COOLANT","INTAKE", "VOLT"}; // some custom gauge labels
int labelXpos[] = {53, 45, 49, 53}; // predefined x-position of a gauge label
//#define potmeterPin A1 // simulate analogue value with potentiometer
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int p, w, m;
u8g_uint_t xx=0;
// ------------------------------------------------- void gauge() ------------------------------------------
void gauge(uint8_t angle) {
// draw border of the gauge
u8g.drawCircle(xcenter,ycenter,arc+6, U8G_DRAW_UPPER_RIGHT);
u8g.drawCircle(xcenter,ycenter,arc+4, U8G_DRAW_UPPER_RIGHT);
u8g.drawCircle(xcenter,ycenter,arc+6, U8G_DRAW_UPPER_LEFT);
u8g.drawCircle(xcenter,ycenter,arc+4, U8G_DRAW_UPPER_LEFT);
// draw the needle
float x1=sin(2*angle*2*3.14/360); // needle position
float y1=cos(2*angle*2*3.14/360);
u8g.drawLine(xcenter, ycenter, xcenter+arc*x1, ycenter-arc*y1);
u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT);
u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT);
u8g.setFont(u8g_font_chikita);
// show scale labels
u8g.drawStr( 15, 42, "0C");
//u8g.drawStr( 25, 18, "25");
u8g.drawStr( 55, 14, "90C");
//u8g.drawStr( 95, 18, "75");
u8g.drawStr( 105, 42, "120C");
// show gauge label
u8g.setPrintPos(labelXpos[1],32);
u8g.print(label[1]);
}
}
//}
// ------------------------------------------------- void setup() ------------------------------------------
void setup(void) {
u8g.firstPage();
do {
pinMode(potmeterPin, INPUT);
u8g.setFont(u8g_font_chikita);
u8g.setColorIndex(1); // Instructs the display to draw with a pixel on.
// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}
// ------------------------------------------------- void loop() ------------------------------------------
void loop(void) {
p = sensors.getTempCByIndex(0);
//p = analogRead(potmeterPin); // get value from potmeter
w = map(p,0,1023,0,100); // map it between 0 and 100
m = map(p,0,1023,0,90); // map needle movement
// show needle and dial
xx = m; // 135 = zero position, 180 = just before middle, 0 = middle, 45 = max
if (xx<45){ // position correction
xx=xx+135;
}
else {
xx=xx-45;
}
// picture loop
{
u8g.firstPage();
do {
gauge(xx);
}
while( u8g.nextPage() );
}
}
Hij zal vast een stuk netter kunnen, maar ben nog redelijk vers omtrend dit gebeuren. Alle suggesties zijn meer dan welkom! (tevens zijn de bitmaps eruit gehaald om hier ruimte te besparen..)
Dank zover!