/*
Demo für analogen Eingang und analogen Ausgang
  Eingang:  analoger Temperatursensor
  Ausgang:  gedimmte LED

  Jörg Vogt
*/

#include <math.h>
#include <LiquidCrystal.h>


const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int PIN_RGB = 11;         // LED
int PIN_THERMISTOR = A0;  // A0

char buf[100];
char str_u[8];
char str_r[8];

double B  = 3950;         // NTC-Parameter
double Rs = 10000;        // Serienwiderstand
double Toc= 273.15;       // 0 C°
double To = 273.15 +25 ;  // 25 C° Normaltemperatur
double Ro = 10000;        // Widerstand bei Normaltemperatur

void setup() {
  lcd.begin(16, 2);       // set up the LCD's number of columns and rows:
  Serial.begin(115200);
}

void loop() {
  fadeLED(PIN_RGB, true);
  int  val = analogRead(PIN_THERMISTOR);
  double u = ( (double) val/1023)*5;  // Spannungswert  
  double r = u / (5-u) * Rs;          // Widerstandswert
  // B-Formel (vereinfachte Steinhart-Hart-Gleichung)
  // 1/T = 1/To + 1/B ln (R / Ro))
  double t = 1 / (log(r/Ro) /B + 1/To) - Toc;

  dtostrf(u, 4, 3, str_u); // Arduino-Library untersützt keine float für sprintf!
  dtostrf(r, 5, 0, str_r);

  sprintf(buf, "%d %s %s", val, str_u, str_r);
  Serial.println( buf );
  
  lcd.setCursor(0, 0);
  lcd.print(buf);
  lcd.setCursor(0, 1);
  lcd.print(t, 2);lcd.print(" C");
  
  fadeLED(PIN_RGB, false);
  //delay(1000);
}

// fade for 1 second
void fadeLED(int RGB, bool up)
{
  int start, step, end;
  if (up) {
    start = 0; step = 5; end = 255;
  } else {
    start = 255, step = -5; end = 0;
  }

  for (int i = start; i != end; i += step) {
    analogWrite(RGB, i);
    delay(20);  // 50 * 20ms = 1 s pro Wechsel
  } 
}


/* 
Parameter vom Manual
A equals 0.001129148;
B equals 0.000234125;
C equals 0.0000000876741;

Alternative Berechnung aus:

https://elektro.turanis.de/html/prj216/index.html

#define PIN_THERMISTOR A0

float R1 = 10000.0;
float logR2, R2, T, Tc;
float c1 = 1.009249522e-03;
float c2 = 2.378405444e-04;
float c3 = 2.019202697e-07;

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    int value = analogRead(PIN_THERMISTOR);
    R2 = R1 * (1023 / (float)value - 1);
    logR2 = log(R2);
    T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
    Tc = T - 273.15;

    Serial.println(String(Tc) + " °C");

    delay(2000);
}
*/
