Arduino Raum Thermometer

webpc passthru 2 1

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.

untitled sketch 3 bb D8vfg3vKwd 1024x806 1

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.

Arduino Thermometer
webpc passthru 2 1

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); 
} 
}
0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert