• 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
#1
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? :Smile

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;
   }
}
 
Odpowiedź
#2
Odkąd zacząłeś się dzielić kodem z arduino robisz wyświetlanie  to z tym:
do {
 cośtamcośtam
  } while (u8g.nextPage());
I masz takich pętli sporo. No to chcesz by coś się wykonywało dopóki nie trzeba zmienić ekranu jak rozumiem. Nic więcej w tym czasie nie działa. Ja się właśnie uczę pisać menu i robię to tak, że odświeżam ekran co określony czas lub natychmiast jeśli coś się zmieniło. Natomiast pętla główna programu działa nieprzerwanie. Wchodzę do jednej funkcji, która ma odświeżyć ekran i albo to robi, albo natychmiast wychodzi. Nawet jeśli był wciśnięty jakiś przycisk i weszło do menu to od razu odpalam zliczanie czasu i po 10s bez naciśnięcia niczego sam wraca na ekran główny programu, po 30s wyłącza również podświetlenie. Tu jest bardzo fajnie zrobione menu: https://starter-kit.nettigo.pl/2017/04/m...aczu-16x2/.  Może zrobisz na bazie tego? A tu jeszcze inne, wszystko możesz sobie wygenerować na stronce: http://www.cohesivecomputing.co.uk/hacka...u-library/ i całość jest wczytana do flash, zamiast RAM, co pozostawia sporo miejsca na własny program. To od Nettigo zżera RAM za szybko przy większym menu. Jest też menu backend opisane tutaj https://forum.arduinopolska.pl/watek-san...2asne-menu   i na majsterkowo: https://majsterkowo.pl/forum/tutoriale-f...t1549.html. Menu bardziej rozbudowane to dla mnie na razie czarna magia. Swoje proste to modyfikacji paru parametrów jednak napisałem w taki sposób by nic nie blokowało - nawet jak wejdę do menu to dalej odczytywane są wszystkie stany/temperatury/działa komunikacja, tylko ekran pokazuje, że możesz sobie coś tam edytować.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Czyli w skrócie według Ciebie ten kod jest zły? Wink zle napisany? Smile według mnie kod jest poprawnie napisany a nie działa- to jest zagadka Wink
 
Odpowiedź
#4
(26-12-2018, 01:00)Automatyk231 napisał(a): Czyli w skrócie według Ciebie ten kod jest zły? Wink zle napisany? Smile według mnie kod jest poprawnie napisany a nie działa

Kolejny początkujący, który twierdzi, ze kompilator działa źle.
Jak to jest, że tylko początkującym kompilator działa źle?
Co nie tak z tymi kompilatorami? Wyczuwają początkującego i robią im na złość?
 
Odpowiedź
#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ź
#6
(26-12-2018, 13:51)Automatyk231 napisał(a): 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ł
Widzę, że metody PiS zagościły na dobre na Forach. Liniia obrony "jak tak nie powiedziałem" albo mydlenie oczu wypowiadając się raz tak za chwile inaczej.

Czyja to wypowiedz
Cytat:według mnie kod jest poprawnie napisany a nie działa

I jak się ma do
Cytat: tylko mówię iż z programem jest coś nie tak


PS
Przy okazji, nie "mówię" ale "napisałem".
 
Odpowiedź
#7
(26-12-2018, 12:03)es2 napisał(a): Kolejny początkujący, który twierdzi, ze kompilator działa źle.

Mógłbyś gdzieś wskazać gdzie kolega napisał coś o kompilatorze panie PiSowcu ? Bo chyba coś jednak pod kopułą nie gra i sobie dostawiasz coś losowo Smile

W skrócie, napisał że nie działa mu poprawnie kod i nie wie dlaczego, a skoro zawiesza Arduino (czytaj Atmege) to znaczy że wgrało się, czyli dalej idąc, program się skompilował, tak - SKOMPILOWAŁ.
Więc oskarżasz kogoś a potem wychodzi że jednak tak nie było, to o czym to świadczy ?
 
Odpowiedź
#8
bullseye dzięki za poparcie - widzę że ten kolega "es2" to wszystkim tak komentuje bez sensownie posty Smile
 
Odpowiedź
#9
(26-12-2018, 14:44)bullseye napisał(a):
(26-12-2018, 12:03)es2 napisał(a): Kolejny początkujący, który twierdzi, ze kompilator działa źle.

Mógłbyś gdzieś wskazać gdzie kolega napisał coś o kompilatorze panie PiSowcu ? Bo chyba coś jednak pod kopułą nie gra i sobie dostawiasz coś losowo Smile

W skrócie, napisał że nie działa mu poprawnie kod i nie wie dlaczego, a skoro zawiesza Arduino (czytaj Atmege) to znaczy że wgrało się, czyli dalej idąc, program się skompilował, tak - SKOMPILOWAŁ.
Więc oskarżasz kogoś a potem wychodzi że jednak tak nie było, to o czym to świadczy ?

Faktycznie ktoś ma cos z kopułą skoro nie potrafi poprawnie zrozumieć dwóch sprzecznych wypowiedzi
Cytat:według mnie kod jest poprawnie napisany a nie działa
Cytat:tylko mówię iż z programem jest coś nie tak
Trochę  mniej C2H5OH i kopuła będzie lepiej funkcjonowała a kolega nie będzie nazywał mnie PISowcem bo z moich wypowiedzi jasno można wywnioskować, że nim nie jestem.

Wesołych świąt życzy psychiatra.
 
Odpowiedź
#10
(26-12-2018, 15:01)Automatyk231 napisał(a): bullseye dzięki za poparcie - widzę że ten kolega "es2" to wszystkim tak komentuje bez sensownie posty Smile

Proponuję napisz tak jak na tym forum na Elektordzie.
Cytat:według mnie kod jest poprawnie napisany a nie działa
Cytat: napisał(a):tylko mówię iż z programem jest coś nie tak


i sprawdź jak szybko temat trafi do kosza.
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości