Начинаю изучать плату Z-UNO. Есть задача управлять приточной вентиляцией в комнате по значениям температуры-влажности-CO2.
Из разных проектов собрал скетч:
Code: Select all
// add library
#include "ZUNO_DHT.h"
#include "EEPROM.h"
// pin connection
#define DHTPIN1 9 // first sensor
#define LedPin0 10
#define LedPin1 11
#define ADDRESS_0 0x00
#define ADDRESS_1 0x01
#define TEMPERATURE_CHANNEL 1
#define HUMIDITY_CHANNEL 2
#define PPM_CHANNEL 3
// Global variables to store data reported via getters
byte switchValue0 = EEPROM.read(ADDRESS_0);
byte switchValue1 = EEPROM.read(ADDRESS_1);
char response[9];
byte cmd[9] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 };
DHT dht1(DHTPIN1, DHT22); // use "DHT11" instead of "DHT22" for DHT11 sensor
int humidity1; // here we will store the humidity of first sensor
int temperature1; // here we will store the temperature of first sensor
int newValue;
int responseHigh;
int responseLow;
int ppm;
// set up channels
ZUNO_SETUP_CHANNELS(
ZUNO_SWITCH_BINARY(getterSwitch0, setterSwitch0),
ZUNO_SWITCH_BINARY(getterSwitch1, setterSwitch1),
ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature1),
ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity1),
ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_CO2_LEVEL, 0, SENSOR_MULTILEVEL_SIZE_TWO_BYTES, SENSOR_MULTILEVEL_PRECISION_ZERO_DECIMALS, getter)
);
ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_ALWAYS_AWAKE);
boolean firstStart = true;
void setup() {
Serial1.begin(9600); //connecting to sensor via UART
dht1.begin();
Serial0.begin();
Serial0.println("start");
}
void loop() {
//Relay
if (firstStart) {
pinMode(LedPin0, OUTPUT);
delay(10);
if (EEPROM.read(ADDRESS_0) == 1)
digitalWrite(LedPin0, LOW);
else
digitalWrite(LedPin0, HIGH);
pinMode(LedPin1, OUTPUT);
delay(10);
if (EEPROM.read(ADDRESS_1) == 1)
digitalWrite(LedPin1, LOW);
else
digitalWrite(LedPin1, HIGH);
}
firstStart = false;
//Sensors
int i = 0;
for (i = 0; i < 9; i++) {
Serial1.write(cmd[i]);
}
delay(100);
i = 0;
while (Serial1.available()) {
response[i] = Serial1.read();
i++;
}
responseHigh = (int) response[2]; // returned High level concentration
responseLow = (int) response[3]; // returned Low level concentration
newValue = (256 * responseHigh) + responseLow;
if ((newValue > (ppm + 100)) || (newValue < (ppm - 100))) {
ppm = newValue;
zunoSendReport(PPM_CHANNEL);
}
delay(1000);
// obtaining readings from the sensor DHT
humidity1 = dht1.readHumidity();
temperature1 = dht1.readTemperature();
Serial0.print("Humidity = ");
Serial0.print(humidity1);
Serial0.println(" % ");
Serial0.print("Temperature = ");
Serial0.print(temperature1);
Serial0.println(" *C");
// send data to channels
zunoSendReport(TEMPERATURE_CHANNEL);
zunoSendReport(HUMIDITY_CHANNEL);
// send every 30 second
delay(30000);
}
//Relay
void setterSwitch0(byte value) {
if (value > 0) {
digitalWrite(LedPin0, LOW);
if (EEPROM.read(ADDRESS_0) != 1)
EEPROM.write(ADDRESS_0, 1);
}
else {
digitalWrite(LedPin0, HIGH);
if (EEPROM.read(ADDRESS_0) != 0)
EEPROM.write(ADDRESS_0, 0);
}
switchValue0 = value;
}
byte getterSwitch0() {
return switchValue0;
}
void setterSwitch1(byte value) {
if (value > 0) {
digitalWrite(LedPin1, LOW);
if (EEPROM.read(ADDRESS_1) != 1)
EEPROM.write(ADDRESS_1, 1);
}
else {
digitalWrite(LedPin1, HIGH);
if (EEPROM.read(ADDRESS_1) != 0)
EEPROM.write(ADDRESS_1, 0);
}
switchValue1 = value;
}
byte getterSwitch1() {
return switchValue1;
}
//Sensors
int getter(void) {
return newValue;
}
byte getterTemperature1() {
return temperature1;
}
byte getterHumidity1() {
return humidity1;
}
т.е. показания прилетают в момент включения датчика и потом только по ручному запросу.
Контроллер RaZberry, дистрибутив самый последний.
В чем может быть проблема?