
#include <LwTx.h>
#include <OneWire.h>
#include <Sleep_n0m1.h>


#define LED_PIN (13) //ledka na desce
#define PWR_Tx (9) //zapinani napájení pro vysílač a teplomer

//---------------------SLEEP-----------------------------------------
Sleep sleep;
unsigned long sleepTime; //how long you want the arduino to sleep
//--------------------------------------------------------------------

// tyto čísla budeme odesílat
byte teplota[] = {0,0,0,0,0,0,0,0,0,0}; 
int ID = 5; //ID je 5

OneWire ds(10); // ds18b20 pin #2 (middle pin) to Arduino pin 10
// ds18b20 pin #1 GND
// ds18b20 pin #3 +5vdc
// 5k ohm resistor between pins 2 & 3

byte i;
byte present = 0;
byte data[12];
byte addr[8];
  
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char buf[20];
 
void setup() {

   //nastaví pin 9 a 13 jako výstup
  pinMode(LED_PIN,OUTPUT);
  //pinMode(PWR_Tx, OUTPUT);
 
  // Zapne ser. komunikaci
  Serial.begin(9600);
  sleepTime = 5000; //set sleep time in ms, max sleep time is 49.7 days
  //digitalWrite(PWR_Tx,HIGH);
 
  // Data do vysílače jsou na pin 3.
  // Další číslo je počet opakovaní vysílaní
  // za sebou, v našem připadě 10x
  lwtx_setup(7, 10, 0, 140);
 } 

void SetTemp() {
  Serial.print("Test teplomeru"); //nastavení teploměru
  if (!ds.search(addr)) 
  {
    Serial.print("Nenalezen");
    teplota[4] = B1100; //nastaveni priznaku Nenalezen
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC not valid!");
      teplota[4] = B1111; //nastaveni priznaku CRC not valid
      delay(1000);
      Serial.println();
      return;
  }
  teplota[4] = B0000; //inicializace v poradku
}

void getTemp() {
  int foo, bar;
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);

  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
  
}
/*
  //----------------kontrolní sekce pro debug-------------------------------------
   if (SignBit) {
    TReading = -TReading;
  }
  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;
}

void printTemp(void) {
  Serial.print("Teplota: ");
  Serial.print(Whole);
  Serial.print(",");
  Serial.print(Fract); 
  Serial.println();  
}
//-------------------------------------------------------------------------------- 
*/
void loop()
{
  
  //digitalWrite(PWR_Tx, LOW);
  SetTemp();
  getTemp();

// rozdělení naměřené teploty na 4 bitové čísla a přiřazení ID zařízení
  teplota[9] = Tc_100;
  teplota[8] = Tc_100 >> 4;
  teplota[7] = Tc_100 >> 8;
  teplota[6] = Tc_100 >> 12; //konverze teploty
  teplota[5] = ID; //ID
  
  // když je vysílač nezaneprázdněn
  if (lwtx_free())
   {
   //odešli data
   lwtx_send(teplota);
   // odešle zprávu na serial o odeslání
   Serial.println("Data odeslana");
   //Serial.print(teplota[4], BIN);
   Serial.println();
   Serial.print(teplota[9], BIN);
   Serial.print(teplota[8], BIN);
   Serial.print(teplota[7], BIN);
   Serial.print(teplota[6], BIN);
   Serial.println();
   Serial.print(teplota[5], BIN);
   Serial.println();
   Serial.print(teplota[4], BIN);
   Serial.println();
   Serial.print(Tc_100);

   digitalWrite(LED_PIN, HIGH);  //pouhé bliknutí
   delay(100);
   digitalWrite(LED_PIN, LOW);
   //digitalWrite(PWR_Tx, HIGH);
   delay(500);

  }
  sleep.pwrDownMode(); //set sleep mode
  sleep.sleepDelay(sleepTime); //sleep for: sleepTime
  delay(100);
}
