TM_thmoe
Published © GPL3+

Temp Blink

Save display and show temperature.

IntermediateShowcase (no instructions)2 hours41
Temp Blink

Things used in this project

Hardware components

PIR Motion Sensor (generic)
PIR Motion Sensor (generic)
×1
DigiSpark
DigiSpark
×1
DS18B20 Programmable Resolution 1-Wire Digital Thermometer
Maxim Integrated DS18B20 Programmable Resolution 1-Wire Digital Thermometer
×1
LED (generic)
LED (generic)
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Code

Thermometer.ino

C/C++
It shows the temperature when you go away.
You must count the ones, then count the tens.
If cold under zero degree it blinks fast and the you can count the negative degree.
//S7-Balkontemperatur-Sender mit Mono-LED-Temperatur-/Relaisanzuganzeige
//Mono-LED-Steuerung: Blinkt erst fr 1-er, dann Pause 5sec. und blinkt fr 10-er im 200ms-Takt, danach Pause 2sec.und Dauer-LED wenn Relais angezogen fr 6sec.dann Pause 2sec.und wieder von vorne,
//                    wenn Sender ausgeschaltet bleibt LED nach der Temperaturanzeige dunkel,
//                      bei Minus-Graden blinkt die LED 9xschnell (100ms-Takt) vor der Temperaturanzeige

//Autor: Thomas Mhrling, 76135Karlsruhe, Moningerstr. 16

//Auf Digispark umgeschrieben 04.04.24

#include <OneWire.h>
#include <dmtimer.h>

//#define DS18S20_ID 0x10
#define DS18B20_ID 0x28

DMTimer timer1(600000000); //Create a timer at 1s interval

const int DLED = 0;//Temperatur-LED
const int Rel = 4;//(Heizerrelais)
const int IR  = 3;
const int HWT = 5;//Hardwaretoolnummer(Empfngerhardwareadresse kein Port)
const int SenderNr = 5;//Hardwaretoolnummer(Empfngerhardwareadresse kein Port)
const int iv = 40000;
const int uv = 40000;
const int iv1 = 2000;
const int iv2 = 16000;

//S7-Datenempfangsbyte: WORD S7S1 -> Adresse 255Bit _ HWT 255Bit
//                                      ^          ^
//                                    xxxxxxxx  _  xxxxxxxx
//                                   HW-Adresse _  HW-Toolnummer
//HW-Adress)=Sendernummer, HW-Toolnummer=vergebene Hardwareteilnummer(kann beliebig definiert werden)
//
//S7-Datenempfangsbyte: WORD S7S2 -> Daten 255Bit _ Daten 255Bit
//                                      ^          ^
//                                    xxxxxxxx  _  xxxxxxxx
//                                   Temperatur _  Temperatur

int temp;
int TZ = 0;
int TE = 0;
int TNK = 0;
int Flag = 0;
int Flag1 = 0;
int Flag2 = 0;
unsigned long _millis = 0;  //gendert am 17.05.2020
unsigned long millis_ = 0;  //gendert am 17.05.2020
int temp0 = 0;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
int temp4 = 0;
int temp5 = 0;
int count = 0;
word S7S1 = 0;
word S7S2 = 0;
int IR_   = 0;

OneWire ds(2);

byte data[12];
byte addr[8];

boolean readTemperature(){
  //find a device
 if (!ds.search(addr)) {
 ds.reset_search();
 return false;
 }
 if (OneWire::crc8( addr, 7) != addr[7]) {
 return false;
 }
 if (addr[0] != DS18B20_ID) {
 return false;
 }
   ds.reset();
 ds.select(addr);
  // Start conversion
 ds.write(0x44, 1);
 // Wait some time...
  }
  
boolean getTemperature(){
     byte i;  
       byte present = 0;
 present = ds.reset();
 ds.select(addr);
 // Issue Read scratchpad command
 ds.write(0xBE);
 // Receive 9 bytes
 for ( i = 0; i < 9; i++) {
 data[i] = ds.read();
 }
 // Calculate temperature value
 temp = ((( (data[1] << 8) + data[0] )*0.0625));//Fahrenheit:*1.8)+32;
 return true;
 
}
/*
void BT_S(){//Balkontemperatur senden
Serial.print(S7S2);
//Serial.print(" ");
Serial.println(S7S1);
//Serial.print("Flag1: ");
//Serial.println(Flag1);
//Serial.print("Temp: ");
//Serial.println(temp);
}
*/
void IRD(){//IR-Sensor auswerten
  IR_ = digitalRead(IR);
  if(IR_){Flag2=1;}
//  Serial.print("Flag2: ");
//  Serial.println(Flag2);
}

void setup(){
//    Serial.print("uv");
//  Serial.println(uv);
//      Serial.print("iv1 ");
//  Serial.println(iv1);
//      Serial.print("iv2 ");
//  Serial.println(iv2);
  pinMode(0, OUTPUT); //Temp.-LED
  pinMode(3, INPUT);
  millis_ = millis();
  S7S1 = word(SenderNr, HWT);//Zusammensetzen von Word1-Sendebytes an S7-RS232-Modul->Sendernummer,Hardwarenummer(1=433MHz-Funkmodul HFY-J18A)
  S7S2 = word(Flag1, temp);//Zusammensetzen von Word1-Sendebytes an S7-RS232-Modul->Temperaturvorzeichen(1=Minustemperatur),Temperatur
  Serial.begin(2400);
//    Serial.print("uv");
//  Serial.println(uv);
}


void loop(){

//  Serial.print("iv ");
//  Serial.println(iv);
//        Serial.print("iv1 ");
//  Serial.println(iv1);
//      Serial.print("iv2 ");
//  Serial.println(iv2);
  digitalWrite(DLED, LOW);
  readTemperature();//liest Dallas18B20-Temperatur
  delay(1000);
  getTemperature();//bergibt den Wert einer Variablen
  delay(1000);
  
  _millis = millis();//bergibt aktuelle Laufzeit einer Variablen

    if(temp < 0) {//wertet 10-er Stellen aus fr LED-Temperaturanzeige
      temp1 = 10;
      temp = temp*(-1);
      Flag1 = 1;
      }else Flag1 = 0;
      
    if((temp > 0) && (temp < 10)){temp5 = 0;}
    if((temp > 9) && (temp < 20)){temp5 = 1;}
    if((temp > 19) && (temp < 30)){temp5 = 2;}
    if((temp > 29) && (temp < 40)){temp5 = 3;}
    if((temp > 39) && (temp < 50)){temp5 = 4;}

    switch(temp5){//zergliedert die 1-er Stellen der verschiedenen 10-er Stellen gleichablaufend
    case 0: 
      temp0 = temp;
      break;
    case 1: 
      temp0 = temp - 10;
      if(temp == 10){temp0 = 1;}//temp0 mu 1 sein nicht null da sonst der for-Zhler nicht richtig funktioniert (zeigt 1-er Stelle an(LED blinkt einmal) anstatt nichts (LED bleibt aus)
      break;
    case 2: 
      temp0 = temp - 20;
      if(temp == 20){temp0 = 1;}
      break;
    case 3: 
      temp0 = temp - 30;
      if(temp == 30){temp0 = 1;}
      break;
    case 4: 
      temp0 = temp - 40;
      if(temp == 40){temp0 = 1;}
      break;
    }
/*
  if(temp < 5) {//Relaissteuerung fr externen Heizer, Temperatur ist fest programmiert (Frostschutzwchter)
    digitalWrite(Rel, HIGH);//schaltet Relais bei Untertemperatur sofort Gradgenau, unabhngig von Intervallzeit (Temperaturanzeige)
    Flag = 1;
    }
   else if((temp > 6) & (Flag1 == 0)){
    digitalWrite(Rel, LOW);
    Flag = 0;
   }*/
//  Serial.print("uv ");
//  Serial.println(uv);
//  if((timer1.isTimeReached())||(Flag2==1)){ //check if execution time has been reached
  if(Flag2==1){
//  if ((_millis - millis_>= uv)||(Flag2==1)) {//leitet nach Intervallzeit (Konstante) eine Temperaturanzeige ein
   if(temp1 == 10) {//bei Minusgraden blinkt die LED erst 9xschnell
    for(int i=0;i<temp1;i++){
     digitalWrite(DLED, HIGH);
     delay(100);
     digitalWrite(DLED, LOW);
     delay(100);
     }
    delay(2000);//erste Pause zur LED-Temperaturbetrachtung nur bei Minusgraden
   }
  for(int i=0;i<temp0;i++){//LED blinkt so oft wie warm (oder kalt, 1-er)
    digitalWrite(DLED, HIGH);
    delay(400);
    digitalWrite(DLED, LOW);
    delay(400);
  }

  count = 0;
  
  delay(4000);//zweite Pause zur LED-Temperaturbetrachtung (bei warm und kalt)
 
   for(int i=0;i<temp5;i++){//LED blinkt so oft wie warm (oder kalt, 10-er)
    digitalWrite(DLED, HIGH);
    delay(400);
    digitalWrite(DLED, LOW);
    delay(400);
   }
   
  temp5 = 0;
  temp1 = 0;
  millis_ = millis();//Reset Zeitzhler
  _millis = millis();
  Flag2 = 0;
  delay(5000);
 }

//  if(_millis - millis_ >= iv1) {//leitet nach Temperaturanzeige Relayanzeige ein
//  if(Flag == 1){digitalWrite(DLED, HIGH);} 
// }
 
/* if(_millis - millis_ >= iv2) {
  digitalWrite(DLED, LOW);
 }*/

 S7S2 = word(Flag1, temp);//Zusammensetzen von Word1-Sendebytes an S7-RS232-Modul->Temperaturvorzeichen(1=Minustemperatur),Temperatur
// BT_S();
 delay(2);
//Serial.print("temp0: ");
//Serial.println(temp0);
//Serial.print("temp5: ");
//Serial.println(temp5);
  IRD();

}

Credits

TM_thmoe
1 project • 0 followers

Comments