#include #include #include #include #include SoftwareSerial *sserial = NULL; Servo servos[8]; int servo_pins[] = {0, 0, 0, 0, 0, 0, 0, 0}; boolean connected = false; int Str2int (String Str_value) { char buffer[10]; //max length is three units Str_value.toCharArray(buffer, 10); int int_value = atoi(buffer); return int_value; } void split(String results[], int len, String input, char spChar) { String temp = input; for (int i=0; ibegin(baud_); Serial.println("ss OK"); } void SS_write(String data) { int len = data.length()+1; char buffer[len]; data.toCharArray(buffer,len); Serial.println("ss OK"); sserial->write(buffer); } void SS_read(String data) { char c = sserial->read(); Serial.println(c); } void pulseInHandler(String data){ int pin = Str2int(data); long duration; if(pin <=0){ pinMode(-pin, INPUT); duration = pulseIn(-pin, LOW); }else{ pinMode(pin, INPUT); duration = pulseIn(pin, HIGH); } Serial.println(duration); } void pulseInSHandler(String data){ int pin = Str2int(data); long duration; if(pin <=0){ pinMode(-pin, OUTPUT); digitalWrite(-pin, HIGH); delayMicroseconds(2); digitalWrite(-pin, LOW); delayMicroseconds(5); digitalWrite(-pin, HIGH); pinMode(-pin, INPUT); duration = pulseIn(-pin, LOW); }else{ pinMode(pin, OUTPUT); digitalWrite(pin, LOW); delayMicroseconds(2); digitalWrite(pin, HIGH); delayMicroseconds(5); digitalWrite(pin, LOW); pinMode(pin, INPUT); duration = pulseIn(pin, HIGH); } Serial.println(duration); } 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); } } void SV_remove(String data) { 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); } 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); } 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); } void sizeEEPROM() { Serial.println(E2END + 1); } void EEPROMHandler(int mode, String data) { String sdata[2]; split(sdata, 2, data, '%'); if (mode == 0) { EEPROM.write(Str2int(sdata[0]), Str2int(sdata[1])); } else { Serial.println(EEPROM.read(Str2int(sdata[0]))); } } 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); String read_ = String(readChar); //Serial.println(readChar); int idx1 = read_.indexOf('%'); int idx2 = read_.indexOf('$'); // separate command from associated data String cmd = read_.substring(1,idx1); String data = read_.substring(idx1+1,idx2); // determine command sent if (cmd == "dw") { DigitalHandler(1, data); } else if (cmd == "dr") { DigitalHandler(0, data); } else if (cmd == "aw") { AnalogHandler(1, data); } else if (cmd == "ar") { AnalogHandler(0, data); } else if (cmd == "pm") { ConfigurePinHandler(data); } else if (cmd == "ps") { pulseInSHandler(data); } else if (cmd == "pi") { pulseInHandler(data); } else if (cmd == "ss") { SS_set(data); } else if (cmd == "sw") { SS_write(data); } else if (cmd == "sr") { SS_read(data); } else if (cmd == "sva") { SV_add(data); } else if (cmd == "svr") { SV_read(data); } else if (cmd == "svw") { SV_write(data); } else if (cmd == "svwm") { SV_write_ms(data); } else if (cmd == "svd") { SV_remove(data); } else if (cmd == "version") { Version(); } else if (cmd == "to") { Tone(data); } else if (cmd == "nto") { ToneNo(data); } else if (cmd == "cap") { readCapacitivePin(data); } else if (cmd == "so") { shiftOutHandler(data); } else if (cmd == "si") { shiftInHandler(data); } else if (cmd == "eewr") { EEPROMHandler(0, data); } else if (cmd == "eer") { EEPROMHandler(1, data); } else if (cmd == "sz") { sizeEEPROM(); } else if (cmd == "dht") { dht(data); } } void setup() { Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("connected"); } void loop() { SerialParser(); }