/**********************************************************************
   Filename:   HC-SR.c  
   CPU :   PIC16F886-SO intenarnal 8MHz 
   WIFI moduli ESP202 (=ESP8266)   
   Name : Pekka Ritamäki 
   Time :  15.1.2016
   Function: lue lämpötila DS1820-anturin  ja PIC 16F886:n  sarajliikenteelle  
  
 
  Tämä laite toimii 3.3V
  Huom pitää olla Brown out reset 2.1V Fuse eli BORV21 !!
  Rele 5V on RB0 
  Ultraääni trigger RC0 (output) ja Echo RC1 (input)  
  Temp anturi  DS1820 eka on RA.0, toka RA.1 ja kolmas RA.2 
  WIFI moduli liitetään sarjaliikenteelle tai toisaalta RS232:lle, juotettavat vaihdot  
   *********************** 
 Files HC-SR.c  main module 
  DS1820.c   lämpötilamittaus DS1820 anturit  0,1 ja 2 
  Ultra4.c  ultraäänietäisyysmittaus HC-SR4:lla 
  WIFI.c    wifimoduli ESP8266 moduulilla ESP202 
  Käyttöjännite 5V 150mA  3.3V LD33 jänniteregulaattorilla 
  max202 RS232 moduli 
  
 
 
;**********************************************************************/
#include <16f886.h>
#device *=16
 
#device ADC=10
#FUSES  WDT                      // Watch Dog Timer
 
#FUSES INTRC_IO                  //INternal osc without output 8MHz
#FUSES NOPROTECT                 //Code is not protected from reads
//#FUSES IESO                      //Internal External Switch Over mode enabled
//#FUSES STVREN                  //Stack full/underflow will cause reset
#FUSES NODEBUG                   //No Debug mode for ICD
#FUSES NOWDT                      // no watchdog
#FUSES PUT                       // Power up timer 
#FUSES NOMCLR                    // Master Clear pin enabled
#FUSES NOLVP                     // No low power programming 
//#FUSES BROWNOUT_NOSL           // älä laita  brownoutia päälle
//#FUSES BROWNOUT_SW               // älä laita   brownoutia päälle
//#FUSES NOBROWNOUT                // älä laita  brownoutia päälle
#FUSES BORV21      // tämä pitää olla 3.3V:lla BORV21 (=2.1V) muuten ei toimi. Muuten Brown Out Reset on BORV40(= 4.0V)!!!!
#use delay(clock=8MHZ,restart_wdt)
#USE RS232(BAUD=115200, XMIT=PIN_C6, RCV=PIN_C7,ERRORS) 
#use spi( NOINIT)   // älä käytä SPI.nastoja SPI-toimintaan 
 
#BYTE PORTA = 5
#byte PORTB = 6
#byte PORTC = 7
#BYTE TRISA = 0x85
#BYTE TRISB = 0x86
#BYTE TRISC = 0x87
 // apu merkkijonoja 
char str1[20]="koe"; 
char str2[20] ; 
char str3[20] ;
char str4[20]; 
char str5[10]; 
 
int8 asetus =20;
char ipd[6] ="+IPD,"; 
//char error[6] ="ERROR"; 
char ok[4]="OK"; 
//char comm[5]="Comm"; 

int8  responce ( void) ; 
int8 ready=0; 

#define  SammutaLED output_high (PIN_C3)  
#define  sytytaLED  output_low(Pin_C3) 

#define  RELEPAALLE output_high (PIN_B0)  
#define  RELEPOIS  output_low(Pin_B0) 


#INCLUDE <stdlib.h>
#include <string.h>

#include "dS1820.c" 
#include "ultra4.c" 
#include "wifi.c" 
#BIT RELE=PORTB.0 
#BIT LED = PORTC.3 

//#define  RELE PIN_B0 


// keskeytys timer1 
// 8MHz/4= 2MHz 
// 2MHz/8 = 125kHz 
// 125kHz /65535 = 1.9Hz 

#ROM 0x2100 ={27} // lämpötila 

#INT_TIMER1
void  timer1_isr ( void) 
{ 
restart_wdt(); 

} 
#define MAXBUFF 32+1
char buffer [MAXBUFF], *ptr; 
int8 commReady =0;  // onko tullut sarjaliikenteeltä +IPD,1,2. merkkijonoa? 
int8 length =0;     // sarjaliikenne pituus 
int8 newasetus=0;   // merkkaa uusi asetus
//int8 setupcounter=0;  // lähetä asetus joka 120 välein  
//========================================================
// tämä on sarjaliikeenne vastaanottorutiini kesketyksellä  
// data tulee bufferiin 
// kunnes siihen tulee \r eli CR merkki  tai maksimi buffer 
// sitten tutkitaan oliko se OK 
//==========================================
#INT_RDA
void  RDA_isr ( void) 
{  
 *ptr = getch(); 
 if(*ptr++ =='\n') { // oliko LF? 

     ready=! strncmp   (ok,buffer,2);// katso onko buffer ok ="OK" 
    // if(ready)  sytytaLED ;    // punainen led päälle 
     commReady = strncmp(ipd,buffer,3); // katso tuleeko   +IPD,1,2:12 neljä merkkiä   
     if (commReady==0 )  {   
        sytytaLED ;    // punainen led päälle 
        strncpy ( str5,buffer+9,  2) ; // siirrä Bufferista ( 9 merkin päästä) 2 merkkiä str5:een
     //   buffer[14] ='\0'; // loppumerkki
        str5[2] ='\0';      // loppumerkki  
          //       printf("\n str5=>%s<Bff %s",str5,buffer);  
         asetus =atoi ( str5);  // muunna ascii-> integer, uusi asetus 
       //  printf("\rASE=%d", asetus); 
  
         newasetus =1; 
        commReady =0; 
     }
    // printf(buffer); 
     ptr= buffer ; // uusi ptr puskurin alkuun 
     length =0;    // pituus nolla 
 }

 
if(++length > MAXBUFF -1 ) { // tutki onko vastaotettupuski täynnä? 
   
  ptr= buffer ;  // nollaa puskuri 
  length =0;    // pituus nolla 
 
}
 

}   
//=============
// pääohjelma 
//=================

void main(void)
{ 
 
    restart_wdt();
    RELEPAALLE;

    ptr =buffer; 
    brownout_enable(false) ; 
  //  setup_wdt(WDT_2304MS);  // watchdog enable 

   printf("\r"); 
    delay_ms(100); 
  
    printf("\r3*DS1820+HC-SR04+ESP8266 P.Ritamaki 10.4.2016\r");
    delay_ms(100); 
 
    setup_adc_ports( NO_ANALOGS );  // ei  analogia kanavia 
    setup_adc(ADC_CLOCK_INTERNAL ); 
    set_adc_channel( 0 );
        restart_wdt();
    setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_2); // timer0 jaetaan   2:lla 
    setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8); // timer1 jaetaan   8:lla 
    enable_interrupts (int_timer1) ;   // timer1 keskeytys 
    enable_interrupts(INT_TIMER0);     // timer0 keskeytys 
    enable_interrupts(INT_RDA);        // sarjaliikennekeskeytys 
    enable_interrupts(GLOBAL);         // saalli yleiskektykset 
    asetus  = read_eeprom (0 );        // hae asetusarvo lämpötlan säädölle eeprommista 


  
 delay_ms(1000); 
 SammutaLED ; // sammuta pun led 
  delay_ms(1000); 
 
  wifi_start ();  // käynnistä  wifi 
 
  while(1)
  {       restart_wdt();
       disable_interrupts(INT_RDA);        // sarjaliikennekeskeytys
       sammutaLED ;
       str1[0]='\0';
       str2[0]='\0'; 
       str3[0]='\0'; 
       str4[0]='\0'; 
  
 
    ultra(); // hae etäisyys tulos str1:lle 
    disable_interrupts(GLOBAL); 
   delay_ms(100); 
   
  disp_A0_DS1820 ();  // laske TempA0
 
   strcat (str1,str2);  // yhdistä ultraääni temp0 
  
   disp_A1_DS1820 ();  // laske TempA1 
   
   strcat (str1,str3);   // yhdistä T2 -> temp1 
     
   disp_A2_DS1820 ();  // laske TempA2 
   
   strcat (str1,str4);   // yhdistäT2 ->  temp2
   wifi(str1);   // monta merkkiä lähetetään, lähet' WIFI:lle 
     enable_interrupts(GLOBAL); 
 /*
//   delay_ms(1000);  
  // if ( setupcounter++ > 1) 
    /*    sprintf (str1,"Setup=%d", asetus); 
        wifi(str1);  
        delay_ms(1000); 
        setupcounter=0; 
 // } 
     sprintf(str1,"\rBuff<%s>", buffer); 
      wifi(str1); 
       delay_ms(1000); 
       */ 
   /*
   while (1) {     
     ch= getchar(); 
     buffer[count++] = ch; 
     if ( count> 10) {
            wifi(buffer); 
          count =0; 
        
         delay_ms(2000); 
          buffer[0]='\0';  
     }
     
   }
   */
    if(newasetus) {  // on tullut uusi asetus WIFI:ltä 
     sprintf(str1,"New setup=%d", asetus); 
   
 
     wifi(str1);
     newasetus=0; 
     write_eeprom (0, asetus ); // kirjoita uusi asetus sisäiseen eeprommin 
     sammutaLED ;
     buffer[0] ='\0' ; 
     ptr= buffer; 
     length =0; 
     delay_ms(3000); 
     }  
  }
  
}
