Next its time to load up the SMS-recieving-and-displaying Arduino sketch, included below. Make sure you have the Fona library installed!
// Fona + Flora SMSsenger bag
// receives and displays text messages on a 8x32 flex NeoPixel matrix
// tutorial: https://learn.adafruit.com/flora-plus-fona
#include "Wire.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"
#define FONA_RX 10
#define FONA_TX 9
#define FONA_RST 6
#define PIN 12
// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
// NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
// Position of the FIRST LED in the matrix; pick two, e.g.
// NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
// NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
// rows or in vertical columns, respectively; pick one or the other.
// NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
// in the same order, or alternate lines reverse direction; pick one.
// See example below for these values in action.
// Parameter 5 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// Example for NeoPixel Shield. In this application we'd like to use it
// as a 5x8 tall matrix, with the USB port positioned at the top of the
// Arduino. When held that way, the first pixel is at the top right, and
// lines are arranged in columns, progressive order. The shield uses
// 800 KHz (v2) pixels that expect GRB color data.
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };
// this is a large buffer for replies
char replybuffer[255];
uint8_t msgLen = 0; // Empty message
int x = matrix.width();
int pass = 0; // variable we'll use to keep track of a cycling of colors
bool newMessageCheck = 1; // variable to toggle checking of SMSs after each message scroll
uint8_t n; // variable for the number of SMSs
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
SoftwareSerial *fonaSerial = &fonaSS;
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
unsigned long prevFrameTime = 0L; // For animation timing
#define FPS 20 // Scrolling speed
void setup() {
Serial.begin(115200);
Serial.println(F("FONA SMS LCD test"));
Serial.println(F("Initializing....(May take 3 seconds)"));
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(40);
matrix.setTextColor(colors[0]);
Serial.println(F("Checking FONA"));
// See if the FONA is responding
fonaSerial->begin(4800);
if (! fona.begin(*fonaSerial)) { // make it slow so its easy to read!
//lcd.print("Not found! :(");
Serial.println(F("Couldn't find FONA"));
while (1);
}
Serial.println(F("FONA is OK"));
delay(1000);
}
void loop() {
unsigned long t = millis(); // Current elapsed time, milliseconds.
// millis() comparisons are used rather than delay() so that animation
// speed is consistent regardless of message length & other factors.
if (newMessageCheck == 1){
while (fona.getNetworkStatus() != 1) {
Serial.println(F("Waiting 4 signal"));
Serial.print(".");
delay(400);
}
Serial.println(F("Waiting for SMS"));
int8_t smsnum = fona.getNumSMS();
if (smsnum < 0) {
Serial.println(F("Could not read # SMS"));
return;
} else {
Serial.print(smsnum);
Serial.println(F(" SMS's on SIM card!"));
}
if (smsnum == 0) return;
else n = smsnum; // there's an SMS! Set index to most recent message
Serial.print(F("\n\rReading SMS #")); Serial.println(n);
uint16_t len;
if(!fona.readSMS(n, replybuffer, 250, &len)) {
// Uh oh failed to read SMS, show error perhaps?
Serial.println("failed to read SMS");
//break;
}
if (len == 0) {
Serial.println(F("[empty slot]"));
n++;
//continue;
}
msgLen = len;
Serial.print(F("***** SMS #")); Serial.print(n);
Serial.print(" ("); Serial.print(len); Serial.println(F(") bytes *****"));
Serial.println(replybuffer);
Serial.println(F("*****"));
newMessageCheck = 0;
}
if((t - prevFrameTime) >= (1000L / FPS)) { // Handle scrolling
matrix.fillScreen(0);
matrix.setCursor(x, 0);
matrix.print(replybuffer);
if(--x < (msgLen * -6)) {
newMessageCheck = 1;
x = matrix.width(); // We must repeat!
if(++pass >= 3) pass = 0;
matrix.setTextColor(colors[pass]);
}
matrix.show();
prevFrameTime = t;
}
}
Page last edited November 18, 2015
Text editor powered by tinymce.