void mcu_main() { int version = api_version(); debug_print(DBG_INFO, "API version: %d.%d\n", version/100, version%100); gpio_setup(GPIO_DHT, OUTPUT); gpio_write(GPIO_DHT, HIGH); /* do not send instructions within 1S after power on to pass the unstable state */ mcu_sleep(100); uint8_t data[DHT_DATA_LEN]; while (1) { int rc; uint8_t humidity, temperature; if ((rc = dht11_read(GPIO_DHT, data, sizeof(data))) == DHT_SUCCESS) { humidity = data[0], temperature = data[2]; debug_print(DBG_INFO, "Humidity: %d%, Temperature: %d C\n", humidity, temperature); // debug_print(DBG_INFO, "%d %d %d %d %d\n", // data[0], data[1], data[2], data[3], data[4]); } else { debug_print(DBG_ERROR, "dht11_read() error [%d]\n", rc); } unsigned char buf[LEN_IPCBUF]; if ((rc = host_receive(buf, sizeof(buf))) > 0 && buf[0] == '?') { rc = mcu_snprintf((char*)buf, LEN_IPCBUF, "RH=%d,T=%d\n", humidity, temperature); host_send(buf, rc); } mcu_sleep(300); } }
static v7_val_t DHT11_read(struct v7 *v7) { int pin, temp, rh; v7_val_t pinv = v7_arg(v7, 0), result; if (!v7_is_number(pinv)) { printf("non-numeric pin\n"); return v7_create_undefined(); } pin = v7_to_number(pinv); if (!dht11_read(pin, &temp, &rh)) { return v7_create_null(); } result = v7_create_object(v7); v7_own(v7, &result); v7_set(v7, result, "temp", 4, 0, v7_create_number(temp)); v7_set(v7, result, "rh", 2, 0, v7_create_number(rh)); v7_disown(v7, &result); return result; }
ICACHE_FLASH_ATTR static v7_val_t DHT11_read(struct v7 *v7, v7_val_t this_obj, v7_val_t args) { int pin, temp, rh; v7_val_t pinv = v7_array_get(v7, args, 0), result; if (!v7_is_double(pinv)) { printf("non-numeric pin\n"); return v7_create_undefined(); } pin = v7_to_double(pinv); if (!dht11_read(pin, &temp, &rh)) { return v7_create_null(); } result = v7_create_object(v7); v7_set(v7, result, "temp", 4, 0, v7_create_number(temp)); v7_set(v7, result, "rh", 2, 0, v7_create_number(rh)); /* prevent the object from being potentially GCed */ v7_set(v7, args, "_tmp", 4, 0, result); return result; }
static void hum_temp_complete_read(struct task* task) { uint8_t dht11_data[5]; result_t result = dht11_read((struct gpio*) task->data, dht11_data); if (result == RESULT_SUCCESS) { struct hum_temp_reading reading = { dht11_data[0], dht11_data[2] }; current_read_event.reading = reading; } else { current_read_event.reading = (struct hum_temp_reading) { 0 }; } event_fire_event((event_t*) ¤t_read_event); } static bool on_hum_temp_reading(event_t* event) { struct hum_temp_read_event* read_event = (struct hum_temp_read_event*) event; struct hum_temp_reading current_reading = read_event->reading; if (current_reading.temperature == 0 && current_reading.humidity == 0) { LOG_ERROR("No humidity / temperature reading received\n", ""); } push_sample(&humidity_20_sec_buffer, current_reading.humidity); push_sample(&humidity_10_min_buffer, current_reading.humidity); push_sample(&temperature_20_sec_buffer, current_reading.temperature); push_sample(&temperature_10_min_buffer, current_reading.temperature); return false; } uint16_t hum_temp_load(void) { uint16_t pos = 0; for (uint8_t i = 0; i < ARRAY_SIZE(sample_buffers); i++) { sample_buffer_init(sample_buffers[i], sample_buffers[i]->samples, sample_buffers[i]->size); eeprom_read_buffer(sample_buffers[i], pos); pos += sample_buffers[i]->count + 2; } return pos; }
static enum v7_err DHT11_read(struct v7 *v7, v7_val_t *res) { enum v7_err rcode = V7_OK; int pin, temp, rh; v7_val_t pinv = v7_arg(v7, 0); if (!v7_is_number(pinv)) { printf("non-numeric pin\n"); *res = v7_create_undefined(); goto clean; } pin = v7_to_number(pinv); if (!dht11_read(pin, &temp, &rh)) { *res = v7_create_null(); goto clean; } *res = v7_create_object(v7); v7_set(v7, *res, "temp", 4, 0, v7_create_number(temp)); v7_set(v7, *res, "rh", 2, 0, v7_create_number(rh)); clean: return rcode; }