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
Updates to fix connection issue on startup and added support for DHT …
…sensors
  • Loading branch information
mkals committed Apr 21, 2019
commit 2d49f8858b0770a6a67b290536a480c13e679767
59 changes: 56 additions & 3 deletions Arduino/arduino.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ def __init__(self, baud=9600, port=None, timeout=2, sr=None):
raise ValueError("Could not find port.")
else:
sr = serial.Serial(port, baud, timeout=timeout)
sr.readline()
sr.flush()
self.sr = sr
self.SoftwareSerial = SoftwareSerial(self)
Expand All @@ -126,7 +127,7 @@ def digitalWrite(self, pin, val):
pin : digital pin number
val : either "HIGH" or "LOW"
"""
if val == "LOW":
if val.upper() == "LOW":
pin_ = -pin
else:
pin_ = pin
Expand Down Expand Up @@ -205,7 +206,7 @@ def pulseIn(self, pin, val):
returns:
duration : pulse length measurement
"""
if val == "LOW":
if val.upper() == "LOW":
pin_ = -pin
else:
pin_ = pin
Expand Down Expand Up @@ -250,7 +251,7 @@ def pulseIn_set(self, pin, val, numTrials=5):
pinMode(pin, INPUT);
long duration = pulseIn(pin, HIGH);
"""
if val == "LOW":
if val.upper() == "LOW":
pin_ = -pin
else:
pin_ = pin
Expand Down Expand Up @@ -410,6 +411,57 @@ def shiftIn(self, dataPin, clockPin, pinOrder):
return int(rd)


def dht(self, pin, module = 0):
"""
Read data from dht temperature and humidity sensors based on the
Adafruit DHT sensor library.
https://github.com/adafruit/DHT-sensor-library

Guide for using library:
https://learn.adafruit.com/dht/using-a-dhtxx-sensor

There are five sensors that work with this library:
- DHT 11: blue cage, less accurate
- DHT 12:
- DHT 21:
- DHT 22: white cage
- AM2301:
Input:
pin (int): pin for data
module (int): 0 = DHT 11 (default),
1 = DHT 12,
2 = DHT 21,
3 = DHT 22,
4 = AM2301
Output:
[float, float, float] in the format:
[ humidity in %,
temperature in celcius,
heat index in celcius ]
"""
try:
if not (0 <= module <= 4):
print("unknown module, must be in range 0 to 4. Using 0 (DHT 11).") # raise exception
except:
module = 0
print("module must be spesified using an integer. Using 0 (DHT 11).")

cmd_str = build_cmd_str("dht", (pin, module,))
try:
self.sr.write(str.encode(cmd_str))
self.sr.flush()
except:
pass
rd = self.sr.readline().decode("utf-8").replace("\r\n", "")
try:
strings = rd.split("&")
return [float(s) for s in strings]
except:
return None




class Shrimp(Arduino):

def __init__(self):
Expand Down Expand Up @@ -497,6 +549,7 @@ def read(self, pin):
return None



class SoftwareSerial(object):

"""
Expand Down
60 changes: 54 additions & 6 deletions sketches/prototype/prototype.ino
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <Wire.h>
#include <Servo.h>
#include <EEPROM.h>
#include <DHT.h>

SoftwareSerial *sserial = NULL;
Servo servos[8];
Expand Down Expand Up @@ -316,6 +317,49 @@ 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));
}

void SerialParser(void) {
char readChar[64];
Serial.readBytesUntil(33,readChar,64);
Expand Down Expand Up @@ -399,16 +443,20 @@ void SerialParser(void) {
}
else if (cmd == "sz") {
sizeEEPROM();
}
}
else if (cmd == "dht") {
dht(data);
}
}

void setup() {
Serial.begin(9600);
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("connected");
}

void loop() {
SerialParser();
}
SerialParser();
}