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 300 // Sleep time in seconds
18 #define RETRY_SLEEP_TIME 15 // Sleep time in seconds
19 #define RETRY_TIME 10000 // stop trying after 10 seconds
20 #define CONNECTION_DELAY 2100000 // Need to delay after connecting WiFi to wait for sensor
22 // Initialize DHT sensor for normal 16mhz Arduino
23 DHT dht(DHTPIN, DHTTYPE);
27 TimingSingleton *timer;
29 MyVector<TransactionStatus *> * transStatusList;
37 // 1) Before running PHOTON's with this firmware,
38 // please go to the master branch and run Init.C
39 // in iotcloud/version2/src/C to initialize
40 // a table on the cloud side.
41 // If you want to read the committed keys and values
42 // on the cloud, then you can use Read.java in
43 // iotcloud/version2/src/java/simple_test.
44 // 2) If you want to use the Serial library,
45 // please install "screen" on your machine and run
46 // it on the serial port right after flashing the
47 // firmware onto the Particle board.
48 // e.g. sudo screen /dev/ttyACM0
50 // We use one I/O pin to power the sensor so
51 // that we can make it go to sleep when we go into
56 //Serial.print("Time begin setup: ");
57 //Serial.println(micros());
59 pinMode(PWRPIN, OUTPUT);
60 digitalWrite(PWRPIN, HIGH);
63 // Connect to WiFi and Particle cloud
64 // Wait for a maximum amount of time - sleep if WiFi is not connected
65 // Wake up and try again afterwards
66 // TODO: either use this or just WiFi connection (below)
68 //if (!waitFor(Particle.connected, RETRY_TIME))
69 // System.sleep(SLEEP_MODE_DEEP, RETRY_SLEEP_TIME);
71 // Connect only to WiFi
74 if (!waitFor(WiFi.ready, RETRY_TIME))
75 System.sleep(SLEEP_MODE_DEEP, RETRY_SLEEP_TIME);
76 // Check if we already got an IP from the router
77 while(WiFi.localIP().toString().equals("0.0.0.0")) { }
78 // Add delay if needed (for the humidity sensor we need ~2s delay)
79 if (micros() < CONNECTION_DELAY)
80 // Delays are in millis but micros() returns microsecond time
81 delay((CONNECTION_DELAY - micros())/1000);
83 // TODO: Profiling WiFi
84 //Serial.println(micros());
87 // Prepare device key from MAC (just last 2 of 6 digits)
91 // TODO: Uncomment the following block to print MAC
92 //for (int i=0; i<6; i++) {
93 // Serial.printf("%02x%s", mac[i], i != 5 ? ":" : "");
97 int64_t mac4 = (int64_t) mac[4];
98 int64_t mac5 = (int64_t) mac[5];
99 machineId = (mac4 * 256) + mac5;
102 timer = TimingSingleton_getInstance();
104 transStatusList = new MyVector<TransactionStatus *>();
105 IoTString *baseurl = new IoTString("http://dc-6.calit2.uci.edu/test.iotcloud/");
106 IoTString *password = new IoTString("reallysecret");
107 //Serial.print("Time begin rebuilding table: ");
108 //Serial.println(micros());
110 t1 = new Table(baseurl, password, machineId, -1);
113 baseurl->releaseRef();
114 password->releaseRef();
116 //Serial.print("Time end setup: ");
117 //Serial.println(micros());
121 // Wait until sensor is ready
123 //Serial.print("Time begin loop: ");
124 //Serial.println(micros());
126 float humid = dht.readHumidity();
127 // Read temperature as Fahrenheit
128 float tempF = dht.readTemperature(true);
129 // Check if any reads failed and exit early (to try again).
134 sprintf(keyBuffer, "humid%d", machineId);
135 IoTString * iKeyHumid = new IoTString(keyBuffer);
136 // Do updates for the temperature
137 sprintf(dataBuffer, "%f", humid);
138 IoTString * iValueHumid = new IoTString(dataBuffer);
140 // Check and create a new key if it isn't created yet
141 t1->createNewKey(iKeyHumid, machineId);
142 t1->startTransaction();
143 t1->put(iKeyHumid, iValueHumid);
144 transStatusList->add(t1->commitTransaction());
148 sprintf(keyBuffer, "tempF%d", machineId);
149 IoTString * iKeyTempF = new IoTString(keyBuffer);
150 // Do updates for the temperature
151 sprintf(dataBuffer, "%f", tempF);
152 IoTString * iValueTempF = new IoTString(dataBuffer);
154 // Check and create a new key if it isn't created yet
155 t1->createNewKey(iKeyTempF, machineId);
156 t1->startTransaction();
157 t1->put(iKeyTempF, iValueTempF);
158 transStatusList->add(t1->commitTransaction());
161 iKeyHumid->releaseRef();
162 iValueHumid->releaseRef();
163 iKeyTempF->releaseRef();
164 iValueTempF->releaseRef();
166 for (uint i = 0; i < transStatusList->size(); i++) {
167 TransactionStatus * status = transStatusList->get(i);
168 if (status->getStatus() != TransactionStatus_StatusCommitted) {
170 digitalWrite(ERRPIN, HIGH); // Turn on LED upon error
176 digitalWrite(PWRPIN, LOW);
179 //Serial.print("Time end loop: ");
180 //Serial.println(micros());
182 System.sleep(SLEEP_MODE_DEEP, SLEEP_TIME);