Project Autus - Automated Plant Chamber

Dependencies:   TextLCD mbed

Fork of keypad_test by Plamen Totev

Autus

This is the codebase accompanying the project Autus.

Autus is an automated growth chamber for plants.

Features

Control Humidity inside chamber wrt to external humidity. Control Temperature inside chamber. ( Peltier Heaters/Coolers ) Water and shower plants. Control soil humidity. Monitor water tanks level (Load Cell) /media/uploads/umairaftab/frdm_-_new_page1.png

Code Base Features

Fixed timing and CRC for DHT-11 Sensor. Fixed OneWire bug for ds18b20

Cyclic Executive Scheduler with Priority. Async IPC framework for PC App over bluetooth

Fake RTC systick, I was having some trouble with the on board rtc.

/media/uploads/umairaftab/download.png

Committer:
umairaftab
Date:
Mon Apr 14 19:18:14 2014 +0000
Revision:
57:7ab93ed49b70
Parent:
38:9f4107db1bff
Cosmetic Changes, Menus added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
umairaftab 38:9f4107db1bff 1 /*
umairaftab 38:9f4107db1bff 2 * OneWireThermometer. Base class for Maxim One-Wire Thermometers.
umairaftab 38:9f4107db1bff 3 * Uses the OneWireCRC library.
umairaftab 38:9f4107db1bff 4 *
umairaftab 38:9f4107db1bff 5 * Copyright (C) <2010> Petras Saduikis <petras@petras.co.uk>
umairaftab 38:9f4107db1bff 6 *
umairaftab 38:9f4107db1bff 7 * This file is part of OneWireThermometer.
umairaftab 38:9f4107db1bff 8 *
umairaftab 38:9f4107db1bff 9 * OneWireThermometer is free software: you can redistribute it and/or modify
umairaftab 38:9f4107db1bff 10 * it under the terms of the GNU General Public License as published by
umairaftab 38:9f4107db1bff 11 * the Free Software Foundation, either version 3 of the License, or
umairaftab 38:9f4107db1bff 12 * (at your option) any later version.
umairaftab 38:9f4107db1bff 13 *
umairaftab 38:9f4107db1bff 14 * OneWireThermometer is distributed in the hope that it will be useful,
umairaftab 38:9f4107db1bff 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
umairaftab 38:9f4107db1bff 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
umairaftab 38:9f4107db1bff 17 * GNU General Public License for more details.
umairaftab 38:9f4107db1bff 18 *
umairaftab 38:9f4107db1bff 19 * You should have received a copy of the GNU General Public License
umairaftab 38:9f4107db1bff 20 * along with OneWireThermometer. If not, see <http://www.gnu.org/licenses/>.
umairaftab 38:9f4107db1bff 21 */
umairaftab 38:9f4107db1bff 22
umairaftab 38:9f4107db1bff 23 #include "OneWireThermometer.h"
umairaftab 38:9f4107db1bff 24 #include "OneWireDefs.h"
umairaftab 38:9f4107db1bff 25 //#include "DebugTrace.h"
umairaftab 38:9f4107db1bff 26
umairaftab 38:9f4107db1bff 27 //DebugTrace pc(OFF, TO_SERIAL);
umairaftab 38:9f4107db1bff 28
umairaftab 38:9f4107db1bff 29 // constructor specifies standard speed for the 1-Wire comms
umairaftab 38:9f4107db1bff 30 // Used to have params for CRCon and useAddress, can't see why you wouldn't use CRC and you have to use address since there could be more than one.
umairaftab 38:9f4107db1bff 31 OneWireThermometer::OneWireThermometer(PinName pin, int device_id) :
umairaftab 38:9f4107db1bff 32 oneWire(pin, STANDARD), deviceId(device_id), resolution(twelveBit)
umairaftab 38:9f4107db1bff 33 {
umairaftab 38:9f4107db1bff 34 // NOTE: the power-up resolution of a DS18B20 is 12 bits. The DS18S20's resolution is always
umairaftab 38:9f4107db1bff 35 // 9 bits + enhancement, but we treat the DS18S20 as fixed to 12 bits for calculating the
umairaftab 38:9f4107db1bff 36 // conversion time Tconv.
umairaftab 38:9f4107db1bff 37 deviceCount = 0;
umairaftab 38:9f4107db1bff 38 }
umairaftab 38:9f4107db1bff 39
umairaftab 38:9f4107db1bff 40 bool OneWireThermometer::initialize()
umairaftab 38:9f4107db1bff 41 {
umairaftab 38:9f4107db1bff 42 // get all the device addresses for use in selectROM() when reading the temperature
umairaftab 38:9f4107db1bff 43 // pc.traceOut("\r\n");
umairaftab 38:9f4107db1bff 44 //pc.traceOut("New Scan\r\n");
umairaftab 38:9f4107db1bff 45
umairaftab 38:9f4107db1bff 46 oneWire.resetSearch();
umairaftab 38:9f4107db1bff 47 while (oneWire.search(address)) // search for 1-wire device address
umairaftab 38:9f4107db1bff 48 {
umairaftab 38:9f4107db1bff 49 //pc.traceOut("Address = ");
umairaftab 38:9f4107db1bff 50 for (int i = 0; i < ADDRESS_SIZE; i++)
umairaftab 38:9f4107db1bff 51 {
umairaftab 38:9f4107db1bff 52 //pc.traceOut("%x ", (int)address[i]);
umairaftab 38:9f4107db1bff 53 devices[deviceCount][i] = address[i];
umairaftab 38:9f4107db1bff 54 }
umairaftab 38:9f4107db1bff 55 //pc.traceOut("\r\n");
umairaftab 38:9f4107db1bff 56 deviceCount++;
umairaftab 38:9f4107db1bff 57 }
umairaftab 38:9f4107db1bff 58
umairaftab 38:9f4107db1bff 59 if (OneWireCRC::crc8(address, ADDRESS_CRC_BYTE) != address[ADDRESS_CRC_BYTE]) // check address CRC is valid
umairaftab 38:9f4107db1bff 60 {
umairaftab 38:9f4107db1bff 61 //pc.traceOut("CRC is not valid!\r\n");
umairaftab 38:9f4107db1bff 62 wait(2);
umairaftab 38:9f4107db1bff 63 return false;
umairaftab 38:9f4107db1bff 64 }
umairaftab 38:9f4107db1bff 65
umairaftab 38:9f4107db1bff 66 if (address[0] != deviceId)
umairaftab 38:9f4107db1bff 67 {
umairaftab 38:9f4107db1bff 68 // Make sure it is a one-wire thermometer device
umairaftab 38:9f4107db1bff 69 if (DS18B20_ID == deviceId){}
umairaftab 38:9f4107db1bff 70 //pc.traceOut("You need to use a DS1820 or DS18S20 for correct results.\r\n");
umairaftab 38:9f4107db1bff 71 else if (DS18S20_ID == deviceId){}
umairaftab 38:9f4107db1bff 72 //pc.traceOut("You need to use a DS18B20 for correct results.\r\n");
umairaftab 38:9f4107db1bff 73 else{}
umairaftab 38:9f4107db1bff 74 // pc.traceOut("Device is not a DS18B20/DS1820/DS18S20 device.\r\n");
umairaftab 38:9f4107db1bff 75
umairaftab 38:9f4107db1bff 76 wait(2);
umairaftab 38:9f4107db1bff 77 return false;
umairaftab 38:9f4107db1bff 78 }
umairaftab 38:9f4107db1bff 79 else
umairaftab 38:9f4107db1bff 80 {
umairaftab 38:9f4107db1bff 81 if (DS18B20_ID == deviceId){} //pc.traceOut("DS18B20 present and correct.\r\n");
umairaftab 38:9f4107db1bff 82 if (DS18S20_ID == deviceId){} //pc.traceOut("DS1820/DS18S20 present and correct.\r\n");
umairaftab 38:9f4107db1bff 83 }
umairaftab 38:9f4107db1bff 84
umairaftab 38:9f4107db1bff 85 return true;
umairaftab 38:9f4107db1bff 86 }
umairaftab 38:9f4107db1bff 87
umairaftab 38:9f4107db1bff 88 // NOTE ON USING SKIP ROM: ok to use before a Convert command to get all
umairaftab 38:9f4107db1bff 89 // devices on the bus to do simultaneous temperature conversions. BUT can
umairaftab 38:9f4107db1bff 90 // only use before a Read Scratchpad command if there is only one device on the
umairaftab 38:9f4107db1bff 91 // bus. For purpose of this library it is assumed there is only one device
umairaftab 38:9f4107db1bff 92 // on the bus.
umairaftab 38:9f4107db1bff 93 void OneWireThermometer::resetAndAddress()
umairaftab 38:9f4107db1bff 94 {
umairaftab 38:9f4107db1bff 95 oneWire.reset(); // reset device
umairaftab 38:9f4107db1bff 96 oneWire.matchROM(address); // select which device to talk to
umairaftab 38:9f4107db1bff 97 }
umairaftab 38:9f4107db1bff 98
umairaftab 38:9f4107db1bff 99 bool OneWireThermometer::readAndValidateData(BYTE* data)
umairaftab 38:9f4107db1bff 100 {
umairaftab 38:9f4107db1bff 101 bool dataOk = true;
umairaftab 38:9f4107db1bff 102
umairaftab 38:9f4107db1bff 103 resetAndAddress();
umairaftab 38:9f4107db1bff 104 oneWire.writeByte(READSCRATCH); // read Scratchpad
umairaftab 38:9f4107db1bff 105
umairaftab 38:9f4107db1bff 106 // pc.traceOut("read = ");
umairaftab 38:9f4107db1bff 107 for (int i = 0; i < THERMOM_SCRATCHPAD_SIZE; i++)
umairaftab 38:9f4107db1bff 108 {
umairaftab 38:9f4107db1bff 109 // we need all bytes which includes CRC check byte
umairaftab 38:9f4107db1bff 110 data[i] = oneWire.readByte();
umairaftab 38:9f4107db1bff 111 // pc.traceOut("%x ", (int)data[i]);
umairaftab 38:9f4107db1bff 112 }
umairaftab 38:9f4107db1bff 113 //pc.traceOut("\r\n");
umairaftab 38:9f4107db1bff 114
umairaftab 38:9f4107db1bff 115 // Check CRC is valid
umairaftab 38:9f4107db1bff 116 if (!(OneWireCRC::crc8(data, THERMOM_CRC_BYTE) == data[THERMOM_CRC_BYTE]))
umairaftab 38:9f4107db1bff 117 {
umairaftab 38:9f4107db1bff 118 // CRC failed
umairaftab 38:9f4107db1bff 119 // pc.traceOut("CRC FAILED... \r\n");
umairaftab 38:9f4107db1bff 120 dataOk = false;
umairaftab 38:9f4107db1bff 121 }
umairaftab 38:9f4107db1bff 122
umairaftab 38:9f4107db1bff 123 return dataOk;
umairaftab 38:9f4107db1bff 124 }
umairaftab 38:9f4107db1bff 125
umairaftab 38:9f4107db1bff 126 float OneWireThermometer::readTemperature(int device)
umairaftab 38:9f4107db1bff 127 {
umairaftab 38:9f4107db1bff 128 BYTE data[THERMOM_SCRATCHPAD_SIZE];
umairaftab 38:9f4107db1bff 129 float realTemp = -999;
umairaftab 38:9f4107db1bff 130
umairaftab 38:9f4107db1bff 131 // need to select which device here.
umairaftab 38:9f4107db1bff 132 for (int i = 0; i < ADDRESS_SIZE; i++)
umairaftab 38:9f4107db1bff 133 {
umairaftab 38:9f4107db1bff 134 address[i] = devices[device][i];
umairaftab 38:9f4107db1bff 135 }
umairaftab 38:9f4107db1bff 136
umairaftab 38:9f4107db1bff 137 resetAndAddress();
umairaftab 38:9f4107db1bff 138 oneWire.writeByte(CONVERT); // issue Convert command
umairaftab 38:9f4107db1bff 139
umairaftab 38:9f4107db1bff 140 // Removed the check for parasitic power, since we waited the same time anyway.
umairaftab 38:9f4107db1bff 141 wait_ms(CONVERSION_TIME[resolution]);
umairaftab 38:9f4107db1bff 142
umairaftab 38:9f4107db1bff 143 if (readAndValidateData(data)) // issue Read Scratchpad commmand and get data
umairaftab 38:9f4107db1bff 144 {
umairaftab 38:9f4107db1bff 145 realTemp = calculateTemperature(data);
umairaftab 38:9f4107db1bff 146 }
umairaftab 38:9f4107db1bff 147
umairaftab 38:9f4107db1bff 148 return realTemp;
umairaftab 38:9f4107db1bff 149 }
umairaftab 38:9f4107db1bff 150
umairaftab 38:9f4107db1bff 151 int OneWireThermometer::getDeviceCount()
umairaftab 38:9f4107db1bff 152 {
umairaftab 38:9f4107db1bff 153 return deviceCount;
umairaftab 38:9f4107db1bff 154 }