This is the code used on my video series "Hybrid Supercapacitor Car Battery" for my own hardware monitoring system. THe videos can be found on madelectronengineering.com

Dependencies:   BurstSPI Fonts INA219 mbed LPC1114_WakeInterruptIn

Fork of SharpMemoryLCD by Paul Staron

main.cpp

Committer:
madelectroneng
Date:
2017-12-26
Revision:
2:0c49a8f32f6e

File content as of revision 2:0c49a8f32f6e:

/* This is a project for madelectronengineering.com
 This code is used for a hardware monitoring system for the Hybrid Supercapacitor Car Battery to monitor the supercap voltage, the LiFeP04 voltage,
current, and wattage, plus also monitor 3 seperate temperature points.

Required hardware:
    STM32 NUCLEO-L073RZ
    TMP36 Temperature Sensors (x3)
    INA219 Current & Voltage Breakout (modify by removing 0.1Ohm resistor and replacing with 0.01Ohm Resistor to measure up to 32Amps
    ST NUCLEO Protoboard
    30k & 7.5k resistors for voltage divider to measure supercap voltage
    0.1Ohm 25W current limiting power resistor in between supercap array and LiFeP04 battery
    Sharp Memory LCD 400x240
    
The INA219 measures the current and amperage on the battery side of the current limiting resistor to keep an eye on the LiFeP04 battery.
voltage divider connects directly to + of supercap array

Arduino equivelant connections:
A0 - TMP36 #1
A1 - TMP36 #2
A2 - TMP36 #3
A3 - Voltage divider Input
A4&A5 - I2C for INA219

Arduino equivelant connections for LCD Screen:
D13 - SClk
D11 - MOSI
D10 - CD
D9 - Enable
D8 - Extcom

*/
#include "mbed.h"
#include "SharpLCD.h"
#include "INA219.hpp"
#include "Neu44x36.h"
#include "Neu31x26.h"
#include "WakeUp.h"

SharpLCD display(PA_7, NC, PA_5, PB_6, PC_7, PA_9); //mosi, miso(not used), sck, cs, enable, extcom
INA219 ina219(PC_1, PC_0, 0x40, 400000, RES_12BITS);
AnalogIn   ain1(PA_0); // connect A0 to Vout(Temp36)
AnalogIn   ain2(PA_1); // connect A1 to Vout(Temp36)
AnalogIn   ain3(PA_4); // connect A2 to Vout(Temp36)
AnalogIn   ain4(PB_0); // Connect A3 to Voltage Divider

int main()
{        
    display.enableDisplay();  //enable sharp memory lcd
    display.clearImmediate();   //clear the screen buffer and screen
    
    display.set_font(Neu44x36);
       
       //only send graphics and text once to the screen during bootup
       display.locate(17,0);
       display.printf("Hybrid Supercap");
       display.locate(75,35);
       display.printf("Car Battery");
       
       display.rect(0,73,195,239, Black);
       display.rect(205,73,399,239, Black);
       display.fillrect(195,73,10,167, Black);
       display.line(1,174,194,174, Black);
       display.line(1,176,194,176, Black);
       display.line(1,107,194,107, Black);
       display.line(206,107,399,107, Black);
       display.line(1,141,194,141, Black);
       display.line(206,141,399,141, Black);
       display.line(1,175,194,175, Black);
       display.line(206,175,399,175, Black);
       display.line(1,209,194,209, Black);
       display.line(206,209,399,209, Black);
       
       display.set_font(Neu31x26);
       display.locate(15,76);
       display.printf("Supercaps");
       display.locate(240,76);
       display.printf("LiFePo4");
       display.locate(30,179);
       display.printf("Resistor");
       
       display.locate(360,110);
       display.printf("V");
       display.locate(360,143);
       display.printf("A");
       display.locate(360,177);
       display.printf("W");
       display.locate(155,212);
       display.printf("'F");
       display.locate(360,212);
       display.printf("'F");
       display.locate(155,143);
       display.printf("'F");
       display.locate(155,110);
       display.printf("V");
       
  while(1) {    
       
       float volt;
       float current_ma;
       float power;
                  
       volt       = ina219.read_bus_voltage();
       current_ma = ina219.read_current_mA() / 1000;
       power      = volt * current_ma;
       
       float V1 = ain1.read() * 3.3; // connect Vs(Tmp36) to 3.3V        
       float tempC1 = (V1-0.5) * 100; // calculate temperature C
       float tempF1 = (tempC1 * 9 / 5) + 32.0; // calculate temperature F
       
       float V2 = ain2.read() * 3.3; // connect Vs(Tmp36) to 3.3V        
       float tempC2 = (V2-0.5) * 100; // calculate temperature C
       float tempF2 = (tempC2 * 9 / 5) + 32.0; // calculate temperature F
       
       float V3 = ain3.read() * 3.3; // connect Vs(Tmp36) to 3.3V        
       float tempC3 = (V3-0.5) * 100; // calculate temperature C
       float tempF3 = (tempC3 * 9 / 5) + 32.0; // calculate temperature F
 
       float V4 = (ain4.read()) * 3.3; // Voltage divider for supercap voltage
       float voltage = (V4 * 5);   // Voltage divider is 1 to 5 ratio
   
       display.set_font(Neu31x26);
       display.locate(210,110);
       display.printf("      ");
       display.locate(210,110);
       display.printf("%+05.2f", volt);      
       display.locate(210,143);
       display.printf("      "); 
       display.locate(210,143);
       display.printf("%+04.1f", current_ma);      
       display.locate(210,177);
       display.printf("      ");
       display.locate(210,177);
       display.printf("%+05.1f", power);      
       display.locate(20,212);
       display.printf("      ");
       display.locate(20,212);
       display.printf("%+03.0f", tempF1);      
       display.locate(210,212);
       display.printf("      ");
       display.locate(210,212);
       display.printf("%+03.0f", tempF2);      
       display.locate(20,143);
       display.printf("      ");
       display.locate(20,143);
       display.printf("%+03.0f", tempF3);      
       display.locate(20,110);
       display.printf("      ");
       display.locate(20,110);
       display.printf("%+05.2f", voltage);       

       display.update();
 
//Set wakeup time for 1 second
//        WakeUp::set_ms(500);
        
        //Enter deepsleep, the program won't go beyond this point until it is woken up
//        deepsleep();   
}
}