Added SSD1306 display support.

Can now send text to a connected display via displayText(text, fontsize).I have commented out the servo control code so that it doesn't fill up the Arduino Nano's memory.
This commit is contained in:
Bryan Poteryko
2019-05-02 16:02:38 -07:00
parent e2444761bd
commit e88c87e73e
2 changed files with 162 additions and 45 deletions

View File

@@ -496,7 +496,77 @@ class Arduino(object):
except:
return None
# Bryan's attempt at extending this package's functionality to include the ability to write text to the Arduino screen.
# I will ignore drawing anything fancy, and just focus on displaying text. If fancy drawings are seen to be useful, they can be added later.
# There will be several functions. One to clear and reset the display,
# one to set up the display to draw things, and one to actually draw the text (the most resource-intensive, so should be called at the end)
# Let's do this.
def setupDisplay(self):
"""
Sets up a I2C-connected SSD1306 display to receive data. This sends
the command 'scs' to the Arduino (SCreen Setup).
Inputs: (TODO)
width: width of the display, in pixels.
height: height of the display, in pixels.
"""
width = 128
height = 32
cmd_str = build_cmd_str("scs", (width, height))
try:
self.sr.write(str.encode(cmd_str))
self.sr.flush()
except:
pass
# not sure what this does
# rd = self.sr.readline().decode("utf-8").replace("\r\n", "")
# try:
# return int(rd)
# except:
# return 0
def clearDisplay(self):
"""
Clears the connected display from its previously-set values. Should
be called before writing anything new to the display.
This sends the command 'scc' to the Arduino (SCreen Clear).
"""
cmd_str = build_cmd_str("scc")
try:
self.sr.write(str.encode(cmd_str))
self.sr.flush()
except:
pass
def displayText(self, text, fontsize=1):
"""
Sets a string of text to be displayed on the connected SSD1306
display. It sends the command 'dst' to the Arduino.
Inputs:
text: A string, containing the characters to be displayed.
fontsize: A single integer value, adjusts the size of the
characters. Please only pass numbers between 1 and 9.
"""
cmd_str = build_cmd_str("dst", (text, fontsize))
try:
self.sr.write(str.encode(cmd_str))
self.sr.flush()
except:
pass
class Shrimp(Arduino):

View File

@@ -1,16 +1,20 @@
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Servo.h>
//#include <Servo.h>
#include <EEPROM.h>
#include <DHT.h>
// NOTE: Requires new libraries for screens:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
void Version(){
Serial.println(F("V0.4"));
}
SoftwareSerial *sserial = NULL;
Servo servos[8];
//Servo servos[8];
int servo_pins[] = {0, 0, 0, 0, 0, 0, 0, 0};
boolean connected = false;
@@ -249,59 +253,59 @@ void pulseInSHandler(String data){
}
void SV_add(String data) {
String sdata[3];
split(sdata,3,data,'%');
int pin = Str2int(sdata[0]);
int min = Str2int(sdata[1]);
int max = Str2int(sdata[2]);
int pos = -1;
for (int i = 0; i<8;i++) {
if (servo_pins[i] == pin) { //reset in place
servos[pos].detach();
servos[pos].attach(pin, min, max);
servo_pins[pos] = pin;
Serial.println(pos);
return;
}
}
for (int i = 0; i<8;i++) {
if (servo_pins[i] == 0) {pos = i;break;} // find spot in servo array
}
if (pos == -1) {;} //no array position available!
else {
servos[pos].attach(pin, min, max);
servo_pins[pos] = pin;
Serial.println(pos);
}
// String sdata[3];
// split(sdata,3,data,'%');
// int pin = Str2int(sdata[0]);
// int min = Str2int(sdata[1]);
// int max = Str2int(sdata[2]);
// int pos = -1;
// for (int i = 0; i<8;i++) {
// if (servo_pins[i] == pin) { //reset in place
// servos[pos].detach();
// servos[pos].attach(pin, min, max);
// servo_pins[pos] = pin;
// Serial.println(pos);
// return;
// }
// }
// for (int i = 0; i<8;i++) {
// if (servo_pins[i] == 0) {pos = i;break;} // find spot in servo array
// }
// if (pos == -1) {;} //no array position available!
// else {
// servos[pos].attach(pin, min, max);
// servo_pins[pos] = pin;
// Serial.println(pos);
// }
}
void SV_remove(String data) {
int pos = Str2int(data);
servos[pos].detach();
servo_pins[pos] = 0;
// int pos = Str2int(data);
// servos[pos].detach();
// servo_pins[pos] = 0;
}
void SV_read(String data) {
int pos = Str2int(data);
int angle;
angle = servos[pos].read();
Serial.println(angle);
// int pos = Str2int(data);
// int angle;
// angle = servos[pos].read();
// Serial.println(angle);
}
void SV_write(String data) {
String sdata[2];
split(sdata,2,data,'%');
int pos = Str2int(sdata[0]);
int angle = Str2int(sdata[1]);
servos[pos].write(angle);
// String sdata[2];
// split(sdata,2,data,'%');
// int pos = Str2int(sdata[0]);
// int angle = Str2int(sdata[1]);
// servos[pos].write(angle);
}
void SV_write_ms(String data) {
String sdata[2];
split(sdata,2,data,'%');
int pos = Str2int(sdata[0]);
int uS = Str2int(sdata[1]);
servos[pos].writeMicroseconds(uS);
// String sdata[2];
// split(sdata,2,data,'%');
// int pos = Str2int(sdata[0]);
// int uS = Str2int(sdata[1]);
// servos[pos].writeMicroseconds(uS);
}
void sizeEEPROM() {
@@ -324,13 +328,13 @@ DHT dhtSensor(dhtSensorPin, DHT11);
void dht(String data) {
String sdata[2];
split(sdata, 2, data, '%');
int dataPin = sdata[0].toInt();
int sensorNumber = sdata[1].toInt();
int sensorType = DHT11; // assume DHT11 as default
if (sensorNumber == 1) {
sensorType = DHT12;
// split(sdata, 2, data, '%');
sensorType = DHT12;
} else if (sensorNumber == 2) {
sensorType = DHT21;
} else if (sensorNumber == 2) {
@@ -361,6 +365,45 @@ void dht(String data) {
Serial.println(String(h) + "&" + String(t) + "&" + String(hic));
}
// TODO: Fix the stuttering problem being caused by the program calling the display parameter multiple times.
// A large function to set up the display, clear it from previously, set a line(s) of text, and write it.
// TODO: I was unable to break this apart into different functions to play around with in Python, due to issues with variable scope. I will come back to this.
void displayText(String data) {
int screen_height = 32;
int screen_width = 128;
// The analog pin number connected to the reset pin of the screen (SDA).
int reset_pin = 4;
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins).
Adafruit_SSD1306 display(screen_width, screen_height, &Wire, 4);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clears previously displayed data and resets the cursor and text colour.
display.clearDisplay();
display.setCursor(0,0);
display.setTextColor(WHITE);
// The input data string contains the text to be written, along with %#,
// where # is the font size. This sets the font size by reading the last
// character of the input data (by default it is 1), and converting it
// to an int. Once that is done, the last two characters are deleted.
int font_size = data[data.length() - 1] - 48;
display.setTextSize(font_size);
data.remove(data.length() - 2);
display.print(data);
// Prints the above to the display. Relatively resource-intensive.
display.display();
delay(50);
}
// TODO: try a switch statement, might save memory.
void SerialParser(void) {
char readChar[64];
Serial.readBytesUntil(33,readChar,64);
@@ -448,6 +491,10 @@ void SerialParser(void) {
else if (cmd == "dht") {
dht(data);
}
// screen display functions go here.
else if (cmd == "dst") {
displayText(data);
}
}
void setup() {