3 #include "TimingSingleton.h"
4 #include "TransactionStatus.h"
7 SYSTEM_MODE(SEMI_AUTOMATIC)
12 #define DHTPIN 2 // Data pin
13 #define PWRPIN D5 // Power pin
14 #define ERRPIN D7 // Error pin
15 #define DHTTYPE DHT22 // DHT 22 (AM2302)
17 #define SLEEP_TIME 30 // Sleep time in seconds
18 #define RETRY_SLEEP_TIME 5 // Sleep time in seconds
19 #define RETRY_TIME 100000 // stop trying after 5 seconds
21 // Initialize DHT sensor for normal 16mhz Arduino
22 DHT dht(DHTPIN, DHTTYPE);
26 TimingSingleton *timer;
28 MyVector<TransactionStatus *> * transStatusList;
36 // 1) Before running PHOTON's with this firmware,
37 // please go to the master branch and run Init.C
38 // in iotcloud/version2/src/C to initialize
39 // a table on the cloud side.
40 // If you want to read the committed keys and values
41 // on the cloud, then you can use Read.java in
42 // iotcloud/version2/src/java/simple_test.
43 // 2) If you want to use the Serial library,
44 // please install "screen" on your machine and run
45 // it on the serial port right after flashing the
46 // firmware onto the Particle board.
47 // e.g. sudo screen /dev/ttyACM0
49 // We use one I/O pin to power the sensor so
50 // that we can make it go to sleep when we go into
55 //Serial.print("Time begin setup: ");
56 //Serial.println(micros());
58 // Wait for maximum 10 seconds - sleep if WiFi is not connected
59 // Wake up and try again after 5 seconds
60 if (!waitFor(Particle.connected, RETRY_TIME))
61 System.sleep(SLEEP_MODE_DEEP, RETRY_SLEEP_TIME);
63 pinMode(PWRPIN, OUTPUT);
65 digitalWrite(PWRPIN, HIGH);
68 // Prepare device key from MAC (just last 2 of 6 digits)
72 // TODO: Uncomment the following block to print MAC
74 //for (int i=0; i<6; i++) {
75 // Serial.printf("%02x%s", mac[i], i != 5 ? ":" : "");
79 int64_t mac4 = (int64_t) mac[4];
80 int64_t mac5 = (int64_t) mac[5];
81 machineId = (mac4 * 256) + mac5;
84 timer = TimingSingleton_getInstance();
86 transStatusList = new MyVector<TransactionStatus *>();
87 IoTString *baseurl = new IoTString("http://dc-6.calit2.uci.edu/test.iotcloud/");
88 IoTString *password = new IoTString("reallysecret");
90 //Serial.print("Time begin rebuilding table: ");
91 //Serial.println(micros());
93 t1 = new Table(baseurl, password, machineId, -1);
96 baseurl->releaseRef();
97 password->releaseRef();
99 //Serial.print("Time end setup: ");
100 //Serial.println(micros());
104 // Wait until sensor is ready
106 //Serial.print("Time begin loop: ");
107 //Serial.println(micros());
109 float humid = dht.readHumidity();
110 // Read temperature as Fahrenheit
111 float tempF = dht.readTemperature(true);
112 // Check if any reads failed and exit early (to try again).
117 sprintf(keyBuffer, "humid%d", machineId);
118 IoTString * iKeyHumid = new IoTString(keyBuffer);
119 // Do updates for the temperature
120 sprintf(dataBuffer, "%f", humid);
121 IoTString * iValueHumid = new IoTString(dataBuffer);
123 // Check and create a new key if it isn't created yet
124 t1->createNewKey(iKeyHumid, machineId);
125 t1->startTransaction();
126 t1->put(iKeyHumid, iValueHumid);
127 transStatusList->add(t1->commitTransaction());
131 sprintf(keyBuffer, "tempF%d", machineId);
132 IoTString * iKeyTempF = new IoTString(keyBuffer);
133 // Do updates for the temperature
134 sprintf(dataBuffer, "%f", tempF);
135 IoTString * iValueTempF = new IoTString(dataBuffer);
137 // Check and create a new key if it isn't created yet
138 t1->createNewKey(iKeyTempF, machineId);
139 t1->startTransaction();
140 t1->put(iKeyTempF, iValueTempF);
141 transStatusList->add(t1->commitTransaction());
144 iKeyHumid->releaseRef();
145 iValueHumid->releaseRef();
146 iKeyTempF->releaseRef();
147 iValueTempF->releaseRef();
149 for (uint i = 0; i < transStatusList->size(); i++) {
150 TransactionStatus * status = transStatusList->get(i);
151 if (status->getStatus() != TransactionStatus_StatusCommitted) {
153 digitalWrite(ERRPIN, HIGH); // Turn on LED upon error
159 digitalWrite(PWRPIN, LOW);
161 //Serial.print("Time end loop: ");
162 //Serial.println(micros());
163 System.sleep(SLEEP_MODE_DEEP, SLEEP_TIME);