Arduino Raum Thermometer
Arduino Raumkomfort-Thermometer
In diesem Beitrag möchte ich euch ein Projekt Vorstellen, das Arduino Raum Thermometer. Auf Arduino.cc habe ich dieses Projekt gefunden und dachte mir, dass kann ich doch schön mit meinen 3D Druckern umsetzen.
Die BOM bleibt gleich, ich habe statt einem Arduino Nano, den Arduino Nano Every benutzt, außerdem habe ich den Schalter für das Wechseln der Anzeigemodi weg gelassen. Das Thermometer wird über das Micro-USB Kabel vom Arduino mit Strom versorgt.
Meine BOM:
Verkabelung
Das Schema der Verkabelung stammt vom Original Beitrag. Die LEDs müssen eigentlich nur am Anfang mit 3 Pins an den Arduino gelötet werden. Bei dem Temperatur Sensor kommt ein 4.7k Ohm Widerstand Parallel in die Datenleitung zu den 5V.
CAD Konstruktion
Als erstes habe ich den LED Streifen (WS218B 144 LED/m) ausgemessen, damit ich den richtigen abstand der LEDs bekomme. Danach habe ich die Zahlen und Markierung eingefügt für 0.5°C Schritte. Die Ausschnitte habe ich gleich so vorgesehen, dass ich es mit mehreren Farben Drucken kann. Dafür habe ich einzelne Körper angelegt und diese als Gruppe zusammengefasst, damit diese sich wieder als ein Modell im Slicer Importieren lassen.
Für den Arduino habe ich einfach nur eine kleine Box auf der Rückseite vorgesehen. Die Kabel kann man da schön verstecken und man kann es damit auch aufstellen.
Das fertige Arduino Raum Thermometer
Gedruckt habe ich das auf meinem Hevo mit 420x420x400 Bauraum und einem angeschlossenen Palette 2S Pro, die Zahlen sind in Orange, die Striche direkt an den Zahlen in 1°C Schritten sind Gold und die restlichen Striche sind in Weiß. Außerdem habe ich dort auch ein PEI Texure Sheet, was eine schöne Oberfläche macht, die aussieht wie gepulvert.
Die LED streifen lassen sich einfach von unten hineinschieben. Bei der Verkabelung habe ich den Taster weg gelassen, da ich nur den Modus möchte, bei dem eine Linie in den verschiedenen Farben (blau bis rot) zu sehen ist. Außerdem habe ich im Programmcode einen Fehler gefunden, bei dem in der Linienanzeige die Anzeige nicht richtig aktualisiert wurde. Das habe ich behoben und den Offset korrigiert, da die angezeigt Temperatur etwas von abgewichen ist.
Programmcode:
#include "Wire.h" // imports the wire library for talking over I2C
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_NeoPixel.h>
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float Celcius=0;
int buttonPin = 2; // momentary push button on pin 0
int oldButtonVal = 0;
#define NUM_PIXEL 50
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, PIN, NEO_GRB + NEO_KHZ800);
int nPatterns = 3;
int lightPattern = 2;
int out =0;
int t =0;
void setup()
{
Serial.begin(9600); //turn on serial monitor
strip.begin();
clearStrip();
strip.show();
strip.setBrightness(2);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH); // button pin is HIGH, so it drops to 0 if pressed
sensors.begin();
}
void testing(){
for(int L = 0; L<50; L++) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255)));//Gradient from blue (cold) to green (ok) to red (warm), first value here 205 = start color, second value here 42 = end color
strip.show();
delay(100);
}
for(int L = 49; L>=0; L--) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255)));//Gradient from blue (cold) to green (ok) to red (warm), first value here 205 = start color, second value here 42 = end color
strip.show();
delay(100);
}
delay(1000);
}
void dot() {
sensors.requestTemperatures();
Celcius=sensors.getTempCByIndex(0)*2-1.5;
int t = map(Celcius, 20, 70, 0, NUM_PIXEL);
for(uint16_t L = 0; L<t; L++) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255))); //Gradient from blue (cold) to green (ok) to red (warm), first value here 205 = start color, second value here 42 = end color
}
strip.show(); //Output on strip
Serial.print("The Temperature is: ");
//Serial.print(Celcius);
Serial.print(sensors.getTempCByIndex(0));
delay(1000);
}
void line() {
sensors.requestTemperatures();
Celcius=sensors.getTempCByIndex(0)*2-1.75;
int t = map(Celcius, 20, 70, 0, NUM_PIXEL);
for(uint16_t L = 0; L<t; L++) {
strip.setPixelColor(L,wheel(((205+(L*3)) & 255))); //Gradient from blue (cold) to green (ok) to red (warm), first value here 205 = start color, second value here 42 = end color
}
strip.show(); //Output on strip
Serial.print("The Temperature is: ");
//Serial.print(Celcius);
Serial.print(sensors.getTempCByIndex(0)-1.75);
delay(1000);
clearStrip();
}
void loop() {
// read that stapressurete of the pushbutton value;
int buttonVal = digitalRead(buttonPin);
if (buttonVal == LOW && oldButtonVal == HIGH) {// button has just been pressed
lightPattern = lightPattern + 1;
}
if (lightPattern > nPatterns) lightPattern = 1;
oldButtonVal = buttonVal;
switch(lightPattern) {
case 1:
dot();
break;
case 2:
line();
break;
case 3:
testing();
break;
}
}
//Color wheel ################################################################
uint32_t wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
else if(WheelPos < 205) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else {
WheelPos -= 205;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
void clearStrip(){
for(int i = 0; i < NUM_PIXEL; i++) {
strip.setPixelColor(i, 0);
}
}
Hinterlasse einen Kommentar
An der Diskussion beteiligen?Hinterlasse uns deinen Kommentar!