This project makes use of the Grove OLED 96x96 display to present a mini-slideshow. Pictures on your computer are transferred to the OLED via a Processing script, and will cycle through them as many times as you choose.
void setup() { //Allow communication to OLED Wire.begin();
//Allow Serial communication between Freetronics Eleven and Computer Serial.begin(28800);
//Initialise the OLED SeeedGrayOled.init(); //Clear the OLED display SeeedGrayOled.clearDisplay(); //Set to vertical mode - horizontal mode doesn't work with this example SeeedGrayOled.setVerticalMode();
}
void loop(){ //Listen for Serial comunication while (Serial.available()>0) { // Read data and send directly to the OLED sendMyData(Serial.read()); counter++;
//When counter reaches 4608 pixels, the picture is complete. if(counter>4607){ //Insert delay to allow viewing of picture. delay(4000); Serial.println("End of Transmission");
//Reset the counter for the next picture counter=0; } } }
// This function was adapted from the SEEED Gray OLED driver so that // character bytes could be sent directly to the OLED. void sendMyData(unsignedchar Data){ Wire.beginTransmission(SeeedGrayOLED_Address); // begin I2C transmission Wire.send(SeeedGrayOLED_Data_Mode); // data mode Wire.send(Data); Wire.endTransmission(); }
// This function was adapted from the SEEED Gray OLED driver so that // commands could be sent directly to the OLED. // NOT USED IN THIS EXAMPLE *********************** void sendMyCommand(unsignedchar Cmd){ Wire.beginTransmission(SeeedGrayOLED_Address); // begin I2C communication Wire.send(SeeedGrayOLED_Command_Mode); // Set OLED Command mode Wire.send(Cmd); Wire.endTransmission(); // End I2C communication }
import processing.serial.*; /* Needed for Serial Communication */
/* Global variables */ Serial comPort; String [] comPortList; String comPortString; PImage img; char[] tempGrey=newchar[4609]; int startOffset=0; ArrayList picNames; int curLoop=1; int totalPics=0; int curPicNum=0; boolean toggleSend=true; boolean sendBouncer=true;
//Change maxLoops to a number > 1 if you want the pictures to loop. int maxLoops=1;
void setup() { //The size of the display is critical (must match the OLED) size(96, 96); //setup Serial comPortList = Serial.list(); if(comPortList.length>0){ //baud rates greater than 28800 may produce unexpected results comPort = new Serial(this, comPortList[0], 28800); comPort.bufferUntil('\n'); } else{ println("NO COM PORTS AVAILABLE"); }
//Create an Array of pictures picNames=new ArrayList(); picNames.add("Picture1.bmp"); picNames.add("Picture2.bmp"); picNames.add("Picture3.bmp"); picNames.add("Picture4.bmp"); // for more pictures just keep adding them to the list. //The actual pictures must be located in the data folder of this project. //Select Sketch/Add File to add the files to this folder. //Make sure that the name of pictures match the names above.
//Get the total number of pictures added totalPics=picNames.size(); }
sendImage((String)picNames.get(curPicNum)); //Send the picture to the OLED toggleSend=false; //temporarily stop sending any more pictures until authorised curPicNum++; //increment in preparation for the next picture
if(curPicNum==totalPics){ curPicNum=0; //go back to the first picture curLoop++; //increment the loop counter } if(curLoop>maxLoops){ sendBouncer=false; //Stop any further looping println("ANIMATION COMPLETE"); } } }
void sendImage(String imgName){ img = loadImage(imgName); image(img,0,0,width,height); loadPixels(); int counter=0; for (int x = 0; x < width; x=x+2) { for (int y = 0; y < height; y++) { counter++; int PixLoc = x + y*height; // this reads down then across2. //Left pixel nibble int Pix1=(round((red(pixels[PixLoc])*0.222+green(pixels[PixLoc])*0.707+blue(pixels[PixLoc])*0.071)))/16; //Right pixel nibble int Pix2=(round((red(pixels[PixLoc+1])*0.222+green(pixels[PixLoc+1])*0.707+blue(pixels[PixLoc+1])*0.071)))/16; //Shift the byte <<4 for the left pixel nibble int PixShift1=Pix1<<4; //Combine both nibbles to form a byte int PixFin = PixShift1+Pix2; byte PixByteFin=byte(PixFin); //Assign this byte to the tempGrey array tempGrey[counter] = char(PixByteFin); } } sendSerial(tempGrey); //Send the image data through the Serial COM Port/ }
//This function will send the byte/Char array to the Freetronics //Eleven or Arduino. void sendSerial(char[] Data){ for(int i=0; i<4608; i++){ //Needs an offset to get picture to align to screen properly //only needs to do this once. if(startOffset==0){ i=i+6; startOffset++; } //Send the picture data to the Freetronics Eleven / Arduino comPort.write(Data[i]); } }
//This function will wait for a response from the Freetronics //Eleven or Arduino before sending any further pictures. void serialEvent (Serial myPort) { // get the ASCII string: String inString = myPort.readStringUntil('\n'); if (inString != null) { println(inString); toggleSend=true; // Allow the next picture to be sent } }
Please note: that you must use the Arduino IDE version 023 until Seeed Studio update their driver for this OLED. Their current driver is not compatible with later versions of Arduino IDE.
No comments:
Post a Comment