Go Down

Topic: display time on MAX7219 base matrix display ??? (Read 5939 times) previous topic - next topic

marco_c

The temperature needs to be converted to a string of characters (look up how to use the sprintf() function) and then that string given to the Parola library to display.
Arduino Libraries https://github.com/MajicDesigns?tab=Repositories
Parola for Arduino https://github.com/MajicDesigns/Parola
Arduino++ blog https://arduinoplusplus.wordpress.com

tolisn63

I tried using the sprintf() function but I always get "?" printed so I used the dtostrf() function.

Below is the complete code that works now.

Code: [Select]
//
// Display text on the matrix followed by the time and the cycle repeats.
//

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <Wire.h>
#include <Rtc_Pcf8563.h>

//init the real time clock
Rtc_Pcf8563 rtc;

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define MAX_DEVICES 6
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10

// set to 1 if we are implementing the user interface pot
#define USE_UI_CONTROL 0

#if USE_UI_CONTROL
#define SPEED_IN A0
#endif // USE_UI_CONTROL

#define PAUSE_TIME 1000
#define SPEED_DEADBAND 5
uint8_t frameDelay = 25; // default frame delay value

MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

#define SPEED_TIME 10
#define PAUSE_TIME 1000

// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE 100
char curMessage[BUF_SIZE];
char newMessage[BUF_SIZE];
bool newMessageAvailable = false;
int tmpAddress = B1001000;
int ResolutionBits = 10;

void readSerial(void)
{
  static uint8_t putIndex = 0;

  while (Serial1.available())
  {
    newMessage[putIndex] = (char)Serial1.read();
    if ((newMessage[putIndex] == '\n') || (putIndex >= BUF_SIZE-3)) // end of message character or full buffer
    {
      // put in a message separator and end the string
      newMessage[putIndex++] = ' ';
      newMessage[putIndex] = '\0';
      // restart the index for next filling spree and flag we have a message waiting
      putIndex = 0;
      strcpy(curMessage, newMessage); // copy it in

    }
    else
      // Just save the next char in next location
      newMessage[putIndex++];
  }
}

// Global variables
uint8_t  curText;
char  szTime[9];
char  szDate[11];
char  szYear[5];
char tmp100[6];
char *pc[] =
{
  "The Time",
  "is",
  szTime,
  "The Date",
  "is",
  szDate,
  szYear,
  "The Temp",
  "is",
  tmp100,
  curMessage,
};

uint8_t  inFX, outFX;
MD_Parola::textEffect_t effect[] =
{
  //  MD_Parola::PRINT,
  MD_Parola::SCROLL_LEFT,
  //  MD_Parola::WIPE,
  //  MD_Parola::SCROLL_UP,
  //  MD_Parola::OPENING_CURSOR,
  //  MD_Parola::BLINDS,
  //  MD_Parola::CLOSING,
  //  MD_Parola::WIPE_CURSOR,
  //  MD_Parola::DISSOLVE,
  //  MD_Parola::OPENING,
  //  MD_Parola::CLOSING_CURSOR,
  //  MD_Parola::SCROLL_RIGHT,
  //  MD_Parola::SCROLL_DOWN,
  //  MD_Parola::SLICE,
};

float getTemperature(){
  Wire.requestFrom(tmpAddress,2);
  byte MSB = Wire.read();
  byte LSB = Wire.read();

  int TemperatureSum = ((MSB << 8) | LSB) >> 4;

  float celsius = TemperatureSum*0.0625;
//sprintf(tmp100,"%f",celsius);
dtostrf(celsius,4,1,tmp100);

  Serial.print("Celsius: ");
  Serial.println(celsius);

}
void SetResolution(){
  if (ResolutionBits < 9 || ResolutionBits > 12) exit;
  Wire.beginTransmission(tmpAddress);
  Wire.write(B00000001); //addresses the configuration register
  Wire.write((ResolutionBits-9) << 5); //writes the resolution bits
  Wire.endTransmission();

  Wire.beginTransmission(tmpAddress); //resets to reading the temperature
  Wire.write((byte)0x00);
  Wire.endTransmission();
}



void setup(void)
{
  Serial.begin(9600);
  Serial1.begin(9600); //bluesmirf default baud rate=9600
  SetResolution();

  //clear out the registers
  //rtc.initClock();
  //set a time to start with.

  //day, weekday, month, century(1=1900, 0=2000), year(0-99)
  // uncomment to set
  //rtc.setDate(2, 3, 1, 0, 14);

  //hr, min, sec
  //uncomment to set
  //rtc.setTime(13, 35, 0);

  P.begin();
  P.setInvert(false);
  P.displayText(pc[curText], MD_Parola::CENTER, SPEED_TIME, PAUSE_TIME, effect[inFX], effect[outFX]);
}

void loop(void)


{
  getTemperature();

  readSerial(); // read serial input

  if (P.displayAnimate()) // animates and returns true when an animation is completed
  {
    strcpy(szTime, rtc.formatTime()); //gets the complete time and stores the complete time in format 23:30:54
    strncpy(szDate, rtc.formatDate(RTCC_DATE_WORLD),5); //Gets the complete date in the format 15/12/2013 and stores only
    //the day and date in the format 15/12
    strncpy(szYear,&rtc.formatDate(RTCC_DATE_WORLD)[6],4); //Gets the complete date in the format 15/12/2013
    //and stores only the year in the format 2014

      // Set the display for the next string.
    curText = (++curText) % ARRAY_SIZE(pc);
    P.setTextBuffer(pc[curText]);

    // When we have gone back to the first string, set a new exit effect
    // and when we have done all those set a new entry effect.
    if (curText == 0)
    {
      outFX = (++outFX) % ARRAY_SIZE(effect);
      if (outFX == 0)
      {
        inFX = (++inFX) % ARRAY_SIZE(effect);
        if (inFX == 0)
          P.setInvert(false);
      }

      P.setTextEffect(effect[inFX], effect[outFX]);
    }

    // Tell Parola we have a new animation
    P.displayReset();
  }


}

Go Up