Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Simplified to core Arduino
  • Loading branch information
mkals committed May 8, 2019
commit 0a481c7d6466249b726308c0d7c7e457bf6f89af
19 changes: 1 addition & 18 deletions Arduino/arduino.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
else:
import glob

libraryVersion = 'V0.5'
libraryVersion = 'V0.6'

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -497,23 +497,6 @@ def dht(self, pin, module = 0):
return None


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):
Expand Down
43 changes: 1 addition & 42 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ build install` from the source directory to install this library.

## Setup:
1. Verify that your Arduino board communicates at the baud rate specified in the
`setup()` function (line 348) in `prototype.ino`. Change it there if necessary.
`setup()` function (line 407) in `prototype.ino`. Change it there if necessary.
2. Load the `prototype.ino` sketch onto your Arduino board, using the Arduino IDE.
3. Set up some kind of serial I/O communication between the Arduino board and your computer (via physical USB cable,
Bluetooth, xbee, etc. + associated drivers)
Expand Down Expand Up @@ -192,47 +192,6 @@ print(board.EEPROM.read(location))
print('EEPROM size {size}'.format(size=board.EEPROM.size()))
```

**Screen**
Display text on an LCD screen.
Use the function displayText(text, fontSize = 1) to display a string on the screen.

**DHT**

- `Arduino.dht(pin, module)` reads sensor values from the DHT sensor connected at the specified pin.

Read data from DHT temperature and humidity sensors based on the
Adafruit [DHT sensor library](https://github.com/adafruit/DHT-sensor-library).

Pass as arguments the pin the sensor is connected to (as an integer) and the sensor type you are using as an integer (see list below).

There are five sensors that work with this library:
- 0 = DHT 11 (blue cage, less accurate)
- 1 = DHT 12
- 2 = DHT 21
- 3 = DHT 22 (white cage)
- 4 = AM2301

The function returns an array of three elements:
1. humidity (in %)
2. temperature (in Celsius)
3. heat index (in Celsius)

If there is an error with the reading (e.g., the selected sensor is wrong) all values will return as zero.

```python
#DHT sensor example
pin = 7
sensorType = 0

data = board.dht(pin, sensorType)
[humidity, temperature, heatIndex] = data

reply = "Humidity = " + str(humidity) + " % \t"
reply += "Temperature = " + str(temperature) + " ˙C \t"
reply += "Heat Index = " + str(heatIndex) + " ˙C"

print(reply)
```

**Misc**

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setuptools.setup(
name="arduino-python3",
version="0.5",
version="0.6",
install_requires=['pyserial'],
author="Morten Kals",
author_email="morten@kals.no",
Expand Down
182 changes: 44 additions & 138 deletions sketches/prototype/prototype.ino
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
#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.5"));
Serial.println(F("V0.6"));
}


SoftwareSerial *sserial = NULL;
//Servo servos[8];
Servo servos[8];
int servo_pins[] = {0, 0, 0, 0, 0, 0, 0, 0};
boolean connected = false;

Expand Down Expand Up @@ -253,59 +248,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() {
Expand All @@ -322,88 +317,6 @@ void EEPROMHandler(int mode, String data) {
}
}

int dhtSensorPin = -1;
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;
} else if (sensorNumber == 2) {
sensorType = DHT21;
} else if (sensorNumber == 2) {
sensorType = DHT22;
} else if (sensorNumber == 2) {
sensorType = AM2301;
}

// do not initialize new sensor if we are reading repeatedly from same sensor
if (dataPin != dhtSensorPin) {
dhtSensorPin = dataPin;
dhtSensor = DHT(dataPin, sensorType);
dhtSensor.begin();
}

// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dhtSensor.readHumidity();
// Read temperature as Celsius (the default)
float t = dhtSensor.readTemperature();

if (isnan(h) || isnan(t)) {
Serial.println("0&0&0");
return;
}

float hic = dhtSensor.computeHeatIndex(t, h, false);
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(100);
}

// TODO: try a switch statement, might save memory.
void SerialParser(void) {
char readChar[64];
Serial.readBytesUntil(33,readChar,64);
Expand Down Expand Up @@ -488,13 +401,6 @@ void SerialParser(void) {
else if (cmd == "sz") {
sizeEEPROM();
}
else if (cmd == "dht") {
dht(data);
}
// screen display functions go here.
else if (cmd == "dst") {
displayText(data);
}
}

void setup() {
Expand Down
Loading