/* * GrowBox * */ #define READ_ANALOG A #define SET_DIGITAL D #define TURN_LIGHT_ON 1 #define TURN_LIGHT_OFF 2 #define TURN_HEATER_ON 3 #define TURN_HEATER_OFF 4 #define TURN_EXHAUST_FAN_ON 5 #define TURN_EXHAUST_FAN_OFF 6 #define TURN_WATER_PUMP_ON 7 #define TURN_WATER_PUMP_OFF 8 #define PIN_LIGHTS 13 // SSR connected to digital pin 13 #define PIN_EXHAUST_FAN 12 // SSR connected to digital pin 12 #define PIN_WATER_PUMP 11 // SSR connected to digital pin 11 #define PIN_HEATER 10 // SSR connected to digital pin 10 int incomingByte = 0; // for incoming serial data char serInString[11]; // DS18S20 Temperature chip i/o OneWire ds(10); // on pin 10 int HighByte, LowByte, TReading, SignBit, Tc_100, Tf_100, Whole, Fract; void setup() { Serial.begin(9600); // Power control pinMode(PIN_LIGHTS, OUTPUT); // sets the digital pin as output pinMode(PIN_EXHAUST_FAN, OUTPUT); // sets the digital pin as output pinMode(PIN_WATER_PUMP, OUTPUT); // sets the digital pin as output pinMode(PIN_HEATER, OUTPUT); // sets the digital pin as output } void loop() { readSerialString(serInString); if (serInString[0] != 0) { switch(serInString[0]) { case READ_ANALOG: Serial.println(analogRead(serInString[0])); case SET_DIGITAL: case TURN_LIGHT_ON: digitalWrite(PIN_LIGHTS, HIGH); // Turn Lights On case TURN_LIGHT_OFF: digitalWrite(PIN_LIGHTS, LOW); // Turn Lights Off case TURN_HEATER_ON: digitalWrite(PIN_HEATER, HIGH); // Turn Heater On case TURN_HEATER_OFF: digitalWrite(PIN_HEATER, LOW); // Turn Heater Off case TURN_EXHAUST_FAN_ON: digitalWrite(PIN_EXHAUST_FAN, HIGH); // Turn Exhaust Fan On case TURN_EXHAUST_FAN_OFF: digitalWrite(PIN_EXHAUST_FAN, LOW); // Turn Exhaust Fan Off case TURN_WATER_PUMP_ON: digitalWrite(PIN_WATER_PUMP, HIGH); // Turn Water Pump On case TURN_WATER_PUMP_OFF: digitalWrite(PIN_WATER_PUMP, LOW); // Turn Water Pump Off } for (int i=0; i <= 3; i++) { serInString[i]=0; } } delay(5000); // waits for a second } //read a string from the serial and store it in an array //you must supply the array variable void readSerialString (char *strArray) { int i = 0; if(Serial.available()) { while (Serial.available()) { strArray[i] = Serial.read(); i++; } } } //utility function to know wither an array is empty or not boolean isStringEmpty(char *strArray) { if (strArray[0] == 0) { return true; } else { return false; } } void readOneWireTemp() { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { Serial.print("No more addresses.\n"); ds.reset_search(); return; } Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } if ( addr[0] != 0x10) { Serial.print("Device is not a DS18S20 family device.\n"); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print("P="); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println(); LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 Tf_100 = (Tc_100 * 9/5) + 32; // Convert to F Whole = Tf_100 / 100; // separate off the whole and fractional portions Fract = Tf_100 % 100; if (SignBit) // If its negative { Serial.print("-"); } Serial.print(Whole); Serial.print("."); if (Fract < 10) { Serial.print("0"); } Serial.print(Fract); Serial.print("\n"); }