25-12-2018, 17:31
Witam wszystkich użytkowników. Czy mógłby ktoś doradzić odnośnie poniższego kodu? Co jest z nim nie tak że zawiesza całe Arduino i w ogóle nic nie działa? :
Kod:
#include "DHT.h"
#include "U8glib.h"
#define LED_INFO_RADIATOR 4
#define LED_INFO_VAPORGENERATOR 13
#define LED_INFO_DEAD_ZONE 1
#define DHTPIN 2
#define DHTTYPE DHT22
const int stateX = 0;
const int stateA = 1;
const int stateB = 2;
const int stateC = 3;
int state = stateA;
const int sizeRangeX = 2;
const int sizeRangeB = 2;
int humidity;
float temperature;
unsigned long currentTime = 0;
unsigned long rememberedTime = 0;
int relayPin = 8;
int relayPin2 = 12;
int relayPin3 = 7;
int relayPin4 = 9;
int potentiometer = A0;
int valuePotentiometer = 0;
int data[5];
int i = 0;
int average;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C(TWI)
DHT dht(DHTPIN, DHTTYPE, 6);
char str[10];
void setup()
{
dht.begin();
pinMode(potentiometer, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(relayPin2, OUTPUT);
pinMode(relayPin3, OUTPUT);
pinMode(relayPin4, OUTPUT);
digitalWrite(relayPin, HIGH);
digitalWrite(relayPin2, HIGH);
digitalWrite(relayPin3, HIGH);
digitalWrite(relayPin4, HIGH);
pinMode(LED_INFO_RADIATOR, OUTPUT);
pinMode(LED_INFO_VAPORGENERATOR, OUTPUT);
pinMode(LED_INFO_DEAD_ZONE, OUTPUT);
}
void decreaseHumidity(void)
{
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB08);
u8g.drawStr(2, 27, "Zmniejszanie wilgotnosci!");
u8g.drawStr(2, 42, "Wilgotnosc :");
u8g.drawStr(80, 42, dtostrf(humidity, 5, 2, str));
u8g.drawStr(110, 42, "%");
u8g.drawStr(2, 57, "Wilg. zad.:");
u8g.drawStr(80, 57, dtostrf(valuePotentiometer, 5, 2, str));
u8g.drawStr(110, 57, "%");
} while (u8g.nextPage());
}
void increaseHumidity(void)
{
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB08);
u8g.drawStr(2, 27, "Zwiekszanie wilgotnosci!");
u8g.drawStr(2, 42, "Wilgotnosc :");
u8g.drawStr(80, 42, dtostrf(humidity, 5, 2, str));
u8g.drawStr(110, 42, "%");
u8g.drawStr(2, 57, "Wilg. zad.:");
u8g.drawStr(80, 57, dtostrf(valuePotentiometer, 5, 2, str));
u8g.drawStr(110, 57, "%");
} while (u8g.nextPage());
}
void deadZone(void)
{
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB08);
u8g.drawStr(2, 27, "Strefa Nieczulosci");
u8g.drawStr(2, 42, "Wilgotnosc :");
u8g.drawStr(80, 42, dtostrf(humidity, 5, 2, str));
u8g.drawStr(110, 42, "%");
u8g.drawStr(2, 57, "Wilg. zad.:");
u8g.drawStr(80, 57, dtostrf(valuePotentiometer, 5, 2, str));
u8g.drawStr(110, 57, "%");
} while (u8g.nextPage());
}
static void turnOnRadiator()
{
digitalWrite(relayPin2, LOW);
digitalWrite(LED_INFO_RADIATOR, HIGH);
}
static void turnOffRadiator()
{
digitalWrite(relayPin2, HIGH);
digitalWrite(LED_INFO_RADIATOR, LOW);
}
static void turnOnFan()
{
digitalWrite(relayPin3, LOW);
digitalWrite(relayPin4, LOW);
}
static void turnOffFan()
{
digitalWrite(relayPin3, HIGH);
digitalWrite(relayPin4, HIGH);
}
static void turnOnVaporGenerator()
{
digitalWrite(relayPin, LOW);
digitalWrite(LED_INFO_VAPORGENERATOR, HIGH);
}
static void turnOffVaporGenerator()
{
digitalWrite(relayPin, HIGH);
digitalWrite(LED_INFO_VAPORGENERATOR, LOW);
}
static void turnOffDeadZone()
{
digitalWrite(LED_INFO_DEAD_ZONE, LOW);
}
static void turnOnDeadZone()
{
digitalWrite(LED_INFO_DEAD_ZONE, HIGH);
}
int potentiometerMeasurement()
{
data[i] = analogRead(A0);
valuePotentiometer = map(data[i], 0, 1023, 0, 100);
i = (i + 1) % 5;
average = 0;
for (int j = 0; j < 5; j++)
average += data[j];
average /= 5.0;
}
void timing()
{
currentTime = millis();
if (currentTime - rememberedTime >= 50UL) {
rememberedTime = currentTime;
}
}
void conditionIncreaseHumidity()
{
turnOffFan();
turnOnRadiator();
turnOffVaporGenerator();
turnOffDeadZone();
}
void conditionDecreaseHumidity()
{
turnOnFan();
turnOffRadiator();
turnOnVaporGenerator();
turnOffDeadZone();
}
void conditionDeadZone()
{
turnOffVaporGenerator();
turnOffRadiator();
turnOffFan();
turnOnDeadZone();
}
int getNewState()
{
int value = potentiometerMeasurement();
int stateXLeftMin = humidity - sizeRangeB - sizeRangeX;
int stateXLeftMax = humidity - sizeRangeB;
int stateXRightMin = humidity + sizeRangeB;
int stateXRightMax = humidity + sizeRangeB + sizeRangeX;
if (value >= stateXLeftMin && value <= stateXLeftMax)
return stateX;
if (value >= stateXRightMin && value <= stateXRightMax)
return stateX;
if (value < stateXLeftMin)
return stateA;
if (value > stateXRightMax)
return stateC;
return stateB;
}
void setStateA()
{
if (state == stateA)
return;
u8g.firstPage();
do {
increaseHumidity();
} while (u8g.nextPage());
conditionIncreaseHumidity();
}
void setStateB()
{
if (state == stateB)
return;
do {
decreaseHumidity();
} while (u8g.nextPage());
conditionDecreaseHumidity();
}
void setStateC()
{
if (state == stateC)
return;
u8g.firstPage();
do {
deadZone();
} while (u8g.nextPage());
conditionDeadZone();
}
void loop()
{
humidity = dht.readHumidity();
temperature = dht.readTemperature();
timing();
potentiometerMeasurement();
int newState = getNewState();
switch (newState) {
case stateA:
setStateA();
break;
case stateB:
setStateB();
break;
case stateC:
setStateC();
break;
}
}