CDY version that shares functionality with Counter

Dependencies:   SDFileSystem_HelloWorld mbed FATFileSystem

main.cpp

Committer:
Charles David Young
Date:
2018-11-04
Revision:
1:622a6f7ed3e6
Parent:
0:aa13e1c335cd
Child:
2:1f78675feba0

File content as of revision 1:622a6f7ed3e6:

#include "mbed.h"
#include "SDFileSystem.h"
#include "ST7565_LCD.h"
#include "QEI.h"

#define BAT_GAIN    6.80
#define BAT_OFFS    0.0

PwmOut      BEEP        (D2);      // Buzzer/speaker (PWM output)
PwmOut      BKL         (D3);      // LCD backlight control (PMW output)
DigitalOut  KAL         (D0);      // Keep-Alive/turn-off
DigitalOut  BTC         (D2);      // Aux BT module control
DigitalIn   Button      (D4);      // Pushbutton (digital input)
AnalogIn    BATT        (A0);      // Battery monitor
AnalogIn    ALS         (A1);      // Ambient Light sensor
 
// SDFileSystem sd(PB_15, PB_14, PB_13, PB_1, "sd"); // MOSI, MISO, SCK, CS

// Quadrature encoder
QEI Wheel(D5, D6, NC, 16);

// Tickers
Ticker Sec_Beat;            // Timer ticker
Ticker Display_Refresh;     // Display refresh ticker

//Serial ports
Serial PC(USBTX, USBRX);    // Virtual COM via USB
//Serial BT_module(D1, D0);    // BlueTooth module 


extern unsigned int buffer[128*64/8];   // RAM buffer used by LCD
time_t seconds;     // timestamp
char Text[40]="";   // Text string used by LCD 
float Vbatt, ALLevel;   // battery voltage and ambient light level

// ------------------- Prototypes ----------------------- 
void Timer_tick(void);
void Update_Display(void);
void Set_Time(void);
void Read_Voltages(void);
void PowerOff(void);

int main() 
{

    KAL = 1;      // ensure self-sustained power
    //Button.mode(PullUp);      // enable pushbutton pull-up
    BKL.period_ms(3);         // set LCD backlight PWM
    BKL.write(1.0);  
    BEEP.period_us(2300);      // set initial buzzer period and duty-cycle
    BEEP.write(0.2);
    Wheel.reset();        // clear encoder
    LCD_reset();   

    // splash screen with date and time
    sprintf(Text,__DATE__);
    LCD_drawstring(buffer, 60, 5, Text);
    sprintf(Text,__TIME__);
    LCD_drawstring(buffer, 78, 6, Text);  
    LCD_write_buffer(buffer);


    // enable LCD refresh ticker        
    Display_Refresh.attach(&Update_Display, 0.3);

    if(Button)   // if pushbutton is pressed
        Set_Time();  // set RTC time and date  

    wait(2);
    Clear_buffer(buffer);
    BKL.write(0.5);
    
    //PowerOff();   // Power-off test


    // enable sec-beat ticker  
    Sec_Beat.attach(&Timer_tick, 1);
      


    // printf("Hello World!\n");    
    // mkdir("/sd/system", 0777);
    // FILE *fp = fopen("/sd/system/sdlog.txt", "w");
    // if(fp == NULL) {
    //     error("Could not open file for write\n");
    // }
    // fprintf(fp, "Hello fun SD Card World!");
    // fclose(fp); 
    // printf("Goodbye World!\n");
    
    while(1) 
    {
       // dance 
    }    
    
    
}


//===========================================================================

// ------------- Called every second ----------------------

void Timer_tick() 
{ 
    seconds = time(NULL); 
    strftime(Text, 50, "%d-%b-%Y  %H:%M:%S", localtime(&seconds));
    LCD_drawstring(buffer, 0, 0, Text);

    // read voltages 
    Read_Voltages();
    
    // write values to buffer
    sprintf(Text,"VBATT= %4.2f", Vbatt);
    LCD_drawstring(buffer, 0, 2, Text);    
    sprintf(Text,"ALL= %4.2f", ALLevel);
    LCD_drawstring(buffer, 0, 3, Text); 
                              
    // Send data to COM port
    //PC.printf("Tset= %3.0f, Tpit= %3.0f, Tmeat= %3.0f, PWM= %3.0f\n",Tset, Tpit, Tmeat, FanSpeed); 

    //LCD_write_buffer(buffer);   // LCD update
                         
    return;
}


//---------------------------------------------------------------------------
void Update_Display(void)
{
    LCD_write_buffer(buffer);   // LCD update 
    return;  
}

//---------------------------------------------------------------------------
void Set_Time(void)
{
    uint8_t Year=0, Month=0, Day=0, Hours=0, Mins=0, Secs=0;
    time_t seconds;
    struct tm t;

    sprintf(Text,"TIME & DATE SETTING");
    LCD_drawstring(buffer, 0, 0, Text); 
    
    // Set year
    while(Button);
    wait_ms(50);  

    while(!Button)
    { 
        if(int(Wheel.getPulses())<0)
            Wheel.reset();
        Year = (uint8_t)(Wheel.getPulses());
        
        if(Year>99) 
            Wheel.reset();
             
        sprintf(Text, "Year: %2d", Year);
        LCD_drawstring(buffer, 0, 2, Text);
   
    }

    // Set month
    while(Button);
    wait_ms(50);  
    Wheel.reset();
    while(!Button)
    { 
        if(int(Wheel.getPulses())<0)
            Wheel.reset();
        Month = (uint8_t)(Wheel.getPulses()/2);
        
        if(Month>11) 
            Wheel.reset();
            
        sprintf(Text, "Month: %2d", Month+1);
        LCD_drawstring(buffer, 0, 3, Text);
   
    }


    // Set day
    while(Button);
    wait_ms(50);  
    Wheel.reset();
    while(!Button)
    { 
        if(int(Wheel.getPulses())<0)
            Wheel.reset();
        Day = (uint8_t)(Wheel.getPulses()/2);
        
        if(Day>30) 
            Wheel.reset();
            
        sprintf(Text, "Day: %2d", Day+1);
        LCD_drawstring(buffer, 0, 4, Text);
   
    }

    // Set hours
    while(Button);
    wait_ms(50);  
    Wheel.reset();
    while(!Button)
    { 
        if(int(Wheel.getPulses())<0)
            Wheel.reset();
        Hours = (uint8_t)(Wheel.getPulses()/2);
        
        if(Hours>22) 
            Wheel.reset();
            
        sprintf(Text, "Hours: %2d", Hours+1);
        LCD_drawstring(buffer, 0, 5, Text);
   
    }
    Hours++;

    // Set minutes
    while(Button);
    wait_ms(50);  
    Wheel.reset();
    while(!Button)
    { 
        if(int(Wheel.getPulses())<0)
            Wheel.reset();
        Mins = (uint8_t)(Wheel.getPulses()/2);
        
        if(Mins>59) 
            Wheel.reset();
            
        sprintf(Text, "Minutes: %2d", Mins);
        LCD_drawstring(buffer, 0, 6, Text);
   
    }

    t.tm_year = Year + 100;
    t.tm_mon  = Month;
    t.tm_mday = Day + 1;
    t.tm_hour = Hours;
    t.tm_min  = Mins;
    t.tm_sec  = Secs;

    seconds = mktime(&t);
    set_time(seconds);
    
    return;
}    


//---------------------------------------------------------------------------
void Read_Voltages(void)
{

    double ADC_value;
    uint8_t smooth = 10; // Number of samples to smooth
    uint8_t i;
    
    // Read battery voltage
    
    ADC_value = BATT.read();    // cleanup
    wait_ms(50);
    ADC_value = 0;    
    for(i=0;i<smooth;i++) 
        ADC_value += BATT.read();       

    ADC_value = ADC_value/smooth;
    Vbatt = (float)(ADC_value*BAT_GAIN)+BAT_OFFS;
    
    
    // Read Ambient Light Level
    
    ADC_value = ALS.read();    // cleanup
    wait_ms(50);
    ADC_value = 0;    
    for(i=0;i<smooth;i++) 
        ADC_value += ALS.read();       

    ADC_value = ADC_value/smooth;
    ALLevel = (float)(ADC_value);      
   
return;
}


//--------------------------------------------------------------------------- 
void PowerOff(void) 
{
    BKL.write(1);
    Clear_buffer(buffer);
    sprintf(Text,"POWERING OFF");
    LCD_drawstring(buffer, 20, 3, Text); 
    LCD_write_buffer(buffer);
    wait(2);
    
    KAL = 0;
}