• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Poprawność kodu
#5
Nie powiedziałem , że kompilator działa źle Wink tylko mówię iż z programem jest coś nie tak bo po wgraniu go na płytkę program w ogóle nie działa , jakby się zawieszał Wink  PS. Dodałem komentarze za co odpowiada konkretna funkcja Big Grin

Kod:
#include "DHT.h"   // biblioteka czujnika dht22
#include "U8glib.h" // bibliteka wyswietlacza

#define LED_INFO_RADIATOR 4          // dioda led
#define LED_INFO_VAPORGENERATOR 13        // dioda led
#define LED_INFO_DEAD_ZONE 1                // dioda led
#define DHTPIN 2
#define DHTTYPE DHT22

// zmienne dotyczące histerezy
const int stateX = 0;
const int stateA = 1;
const int stateB = 2;
const int stateC = 3;

int state = stateA;

// zmienne dotyczące strefy nieczułości
const int sizeRangeX = 2;
const int sizeRangeB = 2;

int humidity;
float temperature;


unsigned long currentTime = 0;
unsigned long rememberedTime = 0;

// zmienne dotyczące przekaźnika
int relayPin = 8;
int relayPin2 = 12;
int relayPin3 = 7;
int relayPin4 = 9;

// zmienne dotyczące potencjometru
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);
}

// funckje wyświetalące na wyświetlaczu odpowiednie znaki
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());
}

// funkcje odnośnie włączania/wyłączania urządzeń za pomocą przekaźnika
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);
}

// funkcja która odczytuje i mapuje wartość z potencjometru
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;
}
// funkcja odmierzania czasu
void timing()
{
  currentTime = millis();

  if (currentTime - rememberedTime >= 50UL) {

      rememberedTime = currentTime;
  }
}
// funckje dotyczące załączania urządzeń napisane w celu uniknięcia "drabinki" w if'ach
void conditionIncreaseHumidity()
{
  turnOffFan();
  turnOnRadiator();
  turnOffVaporGenerator();
  turnOffDeadZone();
}
void conditionDecreaseHumidity()
{
  turnOnFan();
  turnOffRadiator();
  turnOnVaporGenerator();
  turnOffDeadZone();
}
void conditionDeadZone()
{
  turnOffVaporGenerator();
  turnOffRadiator();
  turnOffFan();
  turnOnDeadZone();
}

// funkcja odpowiedzialna za histerezę oraz strefę nieczułości
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;
}
// jest to regulator trójpołożeniowy więc napisane są 3 funkcje dla 3 stanów
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();
}
// główna pętla programu - wywołanie odpowiednich funkcji oraz , w zależności od funkcji getNewState , załączenie odpowiedniego stanu (instrukcja case)
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;
  }
}
+ obrazek ilustrujący :
[Obrazek: 2c4c5827be147.png]
 
Odpowiedź
  


Wiadomości w tym wątku
Poprawność kodu - przez Automatyk231 - 25-12-2018, 17:31
RE: Poprawność kodu - przez kaczakat - 25-12-2018, 22:11
RE: Poprawność kodu - przez Automatyk231 - 26-12-2018, 01:00
RE: Poprawność kodu - przez es2 - 26-12-2018, 12:03
RE: Poprawność kodu - przez bullseye - 26-12-2018, 14:44
RE: Poprawność kodu - przez es2 - 26-12-2018, 15:04
RE: Poprawność kodu - przez Automatyk231 - 26-12-2018, 13:51
RE: Poprawność kodu - przez es2 - 26-12-2018, 13:59
RE: Poprawność kodu - przez Automatyk231 - 26-12-2018, 15:01
RE: Poprawność kodu - przez es2 - 26-12-2018, 15:07
RE: Poprawność kodu - przez Automatyk231 - 26-12-2018, 15:12
RE: Poprawność kodu - przez es2 - 26-12-2018, 15:19
RE: Poprawność kodu - przez Automatyk231 - 26-12-2018, 15:23
RE: Poprawność kodu - przez es2 - 26-12-2018, 16:01
RE: Poprawność kodu - przez Automatyk231 - 26-12-2018, 16:03
RE: Poprawność kodu - przez es2 - 26-12-2018, 16:08
RE: Poprawność kodu - przez Automatyk231 - 26-12-2018, 16:16
RE: Poprawność kodu - przez kaczakat - 27-12-2018, 00:34
RE: Poprawność kodu - przez Automatyk231 - 27-12-2018, 12:35

Skocz do:


Przeglądający: 1 gości