Test code attempting to drive a Ebay SSD1306 128X65 LCD from STM F303K8. The chip responds my I2C address scanner but the LCD never turns on or displays anything.

Dependencies:   SSD1308_128x64_I2C mbed Adafruit_GFX

Fork of Nucleo-F303K8-ADC-TEST by Joseph Ellsworth

Update of sample using Adafruit library to drive a generic Ebay SSD1306 OLED display. On Nucleo-F303K8 it will display reading of first two ADC lines once every couple seconds. Should work with other CPU boards.

main.cpp

Committer:
joeata2wh
Date:
2016-03-30
Revision:
3:47148198f5f2
Parent:
2:dc3e84d595c3

File content as of revision 3:47148198f5f2:

/* Example of Reading all the ADC pins PIN and display ot OLED display using
 Nucleo_F303K8. Displays voltage read from first 2 ADC lines on OLED display

  By Joseph Ellsworth CTO of A2WH
  Take a look at A2WH.com Producing Water from Air using Solar Energy
  March-2016 License: https://developer.mbed.org/handbook/MIT-Licence 
  Please contact us http://a2wh.com for help with custom design projects.

  
  Used to Drive:
   ebay part http://www.ebay.com/itm/152000005331?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
  0-96-I2C-IIC-SPI-Serial-White-OLED-LCD-LED-Display-Module-128X64
  The Datasheet.  https://www.adafruit.com/datasheets/SSD1306.pdf

  Unfortunately this part never turns on using the SSD1308 library.
  but did find that the https://developer.mbed.org/users/nkhorman/code/Adafruit_GFX/
  library works.  Unfortunately the Adafruit library doesn't include the scroll functionality.

  Using my I2C address scanner I found that it responds on Added 120 (x78) ,121 (x79)
  and when the part was unsoldered nothing responded on 120 or 121. According to
  to the page #19 (8.1.5) of the data sheet the I2C address should be 011110
  which seems to map correctly to dec=120 hex=79

 */

#include "mbed.h"
//#include "SSD1308.h"
#include "Adafruit_SSD1306.h"

//#include "mbed_logo.h"

//Pin Defines for I2C Bus
#define D_SDA                  PB_7 // specific for Nucleo-F303K8
#define D_SCL                  PB_6 // specific for Nucleo-F303K8
I2C i2c(D_SDA, D_SCL);

// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx

AnalogIn   pa0(PA_0);
AnalogIn   pa1(PA_1);
PwmOut  fan1(D11);
//PwmOut  fan2(D12);
//PwmOut  fan3(PA_2);
DigitalOut fan2x(D12);

DigitalOut myled(LED1);
const float voltMeterARef = 3.3;

// an I2C sub-class that provides a constructed default
class I2CPreInit : public I2C
{
public:
    I2CPreInit(PinName sda, PinName scl) : I2C(sda, scl) {
        frequency(400000);
        start();
    };
};


I2CPreInit gI2C(D_SDA,D_SCL);
Adafruit_SSD1306_I2c gOled2(gI2C,PB_5);


float readPrint(AnalogIn ain, char *label)
{
    float tval = ain.read();
    float volts = tval * voltMeterARef;
    float perc = tval * 100.0f;
    unsigned short  tvalu16 = ain.read_u16 ();
    pc.printf("adc %s R=%3.3f V=%3.3f U16=%u\r\n",label, tval, volts, tvalu16);
    gOled2.printf("%s=%3.3fV\r\n",label,volts);
    gOled2.display();
    return tval;
}


int main()
{
    pc.baud(9600);
    // Display with the Adafruit Library
    gOled2.printf("%ux%u OLED Display\r\n", gOled2.width(), gOled2.height());
    wait(5);
    gOled2.clearDisplay();
    while(1) {
        myled = !myled;
        gOled2.clearDisplay();
        gOled2.setTextCursor(1,1);
        readPrint(pa0, "PA_0");
        wait(0.1);
        gOled2.setTextCursor(1,10);
        readPrint(pa1, "PA_1");
        
         float pwmpw = 0.3; //0.0005; //0.09; // 0.1001;
         float pwmpp = 3.0; //0.00001; //0.0001; // 0.01001;
         //fan2.period_ms();
         //fan2.pulsewidth_ms(200);
         
         //float pwmpw = 0.1; //0.0005; //0.09; // 0.1001;
         //float pwmpp = 1.0; //0.00001; //0.0001; // 0.01001;
        //fan2.pulsewidth(0.1);
        //fan2.period(1.0  / 10.0);
        //fan2.pulsewidth(2.0);
        //fan2.period(20);
        float pwmduty = 0.1f;
        float unit_time = 10.0;                  
        float total_period = 0.1; //0.7; //3.5; //0.8;
        float num_cycle = (unit_time / total_period) + 1;

        while (pwmduty <= 1.1f) {
            float on_time = total_period * pwmduty;
            float off_time = total_period - on_time;
            //gOled2.clearDisplay();
            gOled2.setTextCursor(1,20);
            wait(0.1);
            gOled2.printf("pwm=%3.3f\r\n", pwmduty);            
            wait(0.1);
            gOled2.display();
            wait(0.1);
            gOled2.display();
            wait(0.1);
            pc.printf("pwm=%3.3f\r\n", pwmduty);            
            //wait(3.0);
            fan2x = 1;
            wait(0.15);
            for (int x=0; x<= num_cycle; x++) {
            
            fan2x = 1;
            wait(on_time);
            fan2x = 0;
            wait(off_time);
            // accelerate to get the motor turning
            // then slow down to the current speed;
            //fan1 = 0.0;
            //fan2 = 0.0;
            //fan3 = 0.0;
            //wait(0.02);
            //fan1 = pwmduty;
            //fan2 = pwmduty;
            //fan3 = pwmduty;
            //fan2 = pwmduty;
            //fan2.period(pwmduty/100);
            //fan2.period(pwmduty);
            
            }
            pwmduty+= 0.1f;
        }        
        //fan1 = 0.0;
        //fan2 = 0.0;
        //fan3 = 0.0;
        wait(3.0);
    }
}