• 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
Problem ze sterowaniem stanami PINÓW
#1
Witam,
postanowiłem zrobić generator koloidalny,
Generalnie prąd podawany jest na srebrne elektrony i woda się elektrolizuje.
Ale nie oto chodzi.
Napisałem program z menu w którym wybiera się napięcie zasilania i czas zmiany polaryzacji.
Kiedy wgrałem do na płytkę nano, to okazało się że cokolwiek bym nie wybrał (napięcie z menu) to zmiana zachodzi wyłącznie na pinie 11, czyli zmienia się stan na niski sterując przekaźnikiem. Proszę o poradę co źle zrobiłem.
wklejam poniżej kod:

Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
#define UP 2       // przycisk  UP na Pin3
#define DOWN 1     // przycisk  DOWN na pinie 2
#define OK 3       // przycisk  OK na pinie 4

long ilosc_zmian = 0;
#define przekaznik32V 8
#define przekaznik24V 9
#define przekaznik18V 10
#define przekaznik12V 11
#define zmiana1 5
#define zmiana2 6
#define stan_OFF 20
#define stan_czekaj1 21  
#define stan_ON 22
#define stan_czekaj2 23

byte state = stan_OFF;
unsigned long  czas = 0;
unsigned long  stoper = 0;
unsigned long  stoper1 = 0;
unsigned long start = 0;
unsigned long czas_od_zmiany = 0;
unsigned long czas_od_zmiany1 = 0;




// --- zmienne: ------------------------------------------------
String s[12] = {   // tablica wszystkich opcji (tutaj przesadziłem z tym 50, bo jest ich 31)
  "Tryb Automat.", "Tryb reczny", "Pomiar TDS",                                // poziom 0 MENU GŁÓWNE
  "<<<- powrot", "Start", "Ustaw czas zmiany", "Start TDS",                                        // poziom 1 Submenu dla PLIK
  "<<<-koniec", "Napiecie 32V", "Napiecie 24V", "Napiecie 18V", "Napiecie 12V",      // poziom 2 Submenu dla EDYCJA
};

// poziom 5 Submenu dla POMOC

int Min[3] = {0, 3, 7}; // tablica położeń dla pierwszej opcji dla danego poziomu
int Max[3] = {2, 6, 11};


volatile int napiecie;
volatile int ak;                  // numer aktualnej opcji
volatile int poziom;              // numer aktualnego poziomu menu
int min, max;                     // min i max dla danego poziomu, czyli pierwsza i ostatnia opcja
int pop = -1;                      // zmienna pomocnicza do sprawdzenia czy nastąpiła zmiana w MENU

bool ekran = true;     ///bool isInLowerLevel = false;
unsigned long czas_zmiany = 1;
volatile int t0 = czas_zmiany * 60;

// ---- funkcja co wybrano ----------------------------------------
int co()            //funkcja zwraca wartość równą indeksowi tablicy s (lub -1)
{
  max = Max[poziom];  // określamy granicę przesuwania menu dla klawisza UP
  min = Min[poziom];  // określamy granicę przesuwania menu dla klawisza UP

  if (digitalRead(DOWN) == LOW) {
    delay(100);  // jeśli DOWN
    if (digitalRead(DOWN) == LOW) {
      ak--;
      if (ak < min) {
        ak = min;
      }
    }
  }
  if (digitalRead(UP) == LOW) {
    delay(100);  // jeśli UP
    if (digitalRead(UP) == LOW) {
      ak++;
      if (ak > max)
      {
        ak = max;
      }
    }
  }
  if (digitalRead(OK) == LOW) {
    delay(100);
    if (digitalRead(OK) == LOW)  // jeśli OK
    {
      if (poziom == 0 && ak == Min[0]) {
        poziom = 1;
        ak = Min[1] + 1;
        return -1;  // przejśćie z pozycji tryb auto do start
      }

      ///-----------------------------------------------------------------

      if (poziom == 0 && ak == 1) {

        //          while (digitalRead(OK) == LOW
        lcd.home();
        lcd.init();
        lcd.backlight();
        lcd.begin(16, 2);
        do
        {
          lcd.setCursor(0, 0);
          lcd.print("USTAW CZAS");
          lcd.setCursor(0, 1);
          lcd.print("ZMIANY:");

          if (digitalRead(DOWN) == LOW) {
            delay(100);  // jeśli DOWN
            if (digitalRead(DOWN) == LOW) {
              czas_zmiany--;
              t0 = czas_zmiany * 60;

              if (czas_zmiany < 1) {
                czas_zmiany = 1;
                t0 = czas_zmiany * 60;

              }
            }
          }
          if (digitalRead(UP) == LOW) {
            delay(100);  // jeśli DOWN
            if (digitalRead(UP) == LOW) {
              czas_zmiany++;
              t0 = czas_zmiany * 60;
              if (czas_zmiany >= 1001) {
                czas_zmiany = 1000;
                t0 = czas_zmiany * 60;
              }
            }
          }
          lcd.setCursor(9, 1);
          lcd.print(czas_zmiany);
          delay(200);
        }
        while (digitalRead(OK) == !LOW);
        poziom = 2;
        ak = 8;
        return -1;  // przejśćie z pozycji tryb reczny do ustaw czas
      }
     ////////////////////////////////////////////////////////////

      if (poziom == 2 && ak == 8)
      {
        napiecie = 32;
        return ak;
      }
      if (poziom == 2 && ak == 9)
      {
        napiecie = 24;
        return ak;
      }
      if (poziom == 2 && ak == 10)
      {
        napiecie = 18;
        return ak;
      }
      if (poziom == 2 && ak == 11)
      {
        napiecie = 12;
        return ak;
      }

      //////////////////////////////////////////////////////////////////

      if (poziom == 0 && ak == 2) {
        poziom = 1;
        ak = 6;
        return -1;  // przejśćie z pozycji pomiar TDS do Start TDS
      }
      ///////////////////////////////////////////////////////////

      //     // takie tam sztuczki :-)
      //      if (poziom > 0 && ak > Min[poziom]) {
      //        return ak;                             ///// przycisk  przy wartości start
      //      }


      ////////////////////////////////////////////////////////////////////////////////

      if (ak == 4)
      {
        return ak;
      }


      ////////////////////////////////////////////////////////////////////////////
      if (poziom > 0 && ak == Min[poziom]) {
        ak = poziom - 1;
        poziom = 0;
        digitalWrite(przekaznik32V, HIGH);
        digitalWrite(przekaznik24V, HIGH);
        digitalWrite(przekaznik18V, HIGH);
        digitalWrite(przekaznik12V, HIGH);
        return -1;
      }


    }
    // jak nic nie naciśnięto to jednak coś trza zwrócić   :-)
  }

  return -1;
}

void wybor_pradu()
{
  if (napiecie = 32)
  {
    digitalWrite(przekaznik32V, LOW);
    digitalWrite(przekaznik24V, HIGH);
    digitalWrite(przekaznik18V, HIGH);
    digitalWrite(przekaznik12V, HIGH);
  }
  if (napiecie = 24)
  {
    digitalWrite(przekaznik32V, HIGH);
    digitalWrite(przekaznik24V, LOW);
    digitalWrite(przekaznik18V, HIGH);
    digitalWrite(przekaznik12V, HIGH);
  }
  if (napiecie = 18)
  {
    digitalWrite(przekaznik32V, HIGH);
    digitalWrite(przekaznik24V, HIGH);
    digitalWrite(przekaznik18V, LOW);
    digitalWrite(przekaznik12V, HIGH);
  }

  if (napiecie = 12)
  {
    digitalWrite(przekaznik32V, HIGH);
    digitalWrite(przekaznik24V, HIGH);
    digitalWrite(przekaznik18V, HIGH);
    digitalWrite(przekaznik12V, LOW);
  }
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void przel() { ///// do zrobienia \/\/\/\/\/\/\/\/\/\

while (ilosc_zmian<1000){
switch (state) {
    case stan_OFF:
      digitalWrite(zmiana1, LOW);
      digitalWrite(zmiana2, LOW);
      state = stan_czekaj1;
      ilosc_zmian++;
      czas_od_zmiany = millis();
      lcd.clear();
      break;
     
    case stan_czekaj1:
      if ((millis() - czas)/1000 >= t0)
      {
        state = stan_ON;
        czas = millis();
      }
      stoper = (millis() - start) / 1000 / 60 ;
      lcd.setCursor(0, 0);
      lcd.print("Czas:");
      lcd.print(stoper);
      lcd.setCursor(10, 0);
      lcd.print("Iz=");
      lcd.print(ilosc_zmian);
      lcd.setCursor(0, 1);
      lcd.print("T:");
      stoper1 = (millis() - czas_od_zmiany) / 1000;
      lcd.print(stoper1);
      lcd.print("s");
      lcd.setCursor(10, 1);
      lcd.print("Tz= ");
      lcd.print(czas_zmiany);
      break;
     
    case stan_ON:
      digitalWrite(zmiana1, HIGH);
      digitalWrite(zmiana2, HIGH);
      state = stan_czekaj2;
      ilosc_zmian++;
      czas_od_zmiany1 = millis();
      lcd.clear();
      break;
    case stan_czekaj2:
      if ((millis() - czas)/1000 >= t0 )
      {
        state = stan_OFF;
        czas = millis();
      }
      stoper = (millis() - start) / 1000 / 60 ;
      lcd.setCursor(0, 0);
      lcd.print("Czas:");
      lcd.print(stoper);
      lcd.setCursor(10, 0);
      lcd.print("Iz=");
      lcd.print(ilosc_zmian);
      lcd.setCursor(0, 1);
      lcd.print("T:");
      stoper1 = (millis() - czas_od_zmiany1) / 1000;
      lcd.print(stoper1);
      lcd.print("s");
      lcd.setCursor(10, 1);
      lcd.print("Tz= ");
      lcd.print(czas_zmiany);
      break;
  }
}
}
///////////// do zrobienia /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\
// === neverending story ===============================================

// --- funkcja do prezentacji MENU na Serialu --------------------------
void pokazSerial()
{
  lcd.home();
  lcd.clear();
  lcd.setCursor(2, 1);
  lcd.print(s[ak]);
  lcd.print(ak);
 

  // nowa linia
}
// ---------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);            // inicjalizacja Seriala
  pinMode(DOWN, INPUT_PULLUP);   // konfiguracja pinów dla przycisków
  pinMode(UP, INPUT_PULLUP);     // konfiguracja pinów dla przycisków
  pinMode(OK, INPUT_PULLUP);     // konfiguracja pinów dla przycisków
  ak = 0; poziom = 0;            // parametry początkowe MENU
  max = Max[poziom];             // index dla ost. pozycji menu
  min = Min[poziom];             // index dla pierwszej pozycji menu
  pinMode(przekaznik32V, OUTPUT);     // konfiguracja pinów dla przycisków
  pinMode(przekaznik24V, OUTPUT);
  pinMode(przekaznik18V, OUTPUT);
  pinMode(przekaznik12V, OUTPUT);
  pinMode(zmiana1, OUTPUT);
  pinMode(zmiana2, OUTPUT);

  digitalWrite(przekaznik32V, HIGH);
  digitalWrite(przekaznik24V, HIGH);
  digitalWrite(przekaznik18V, HIGH);
  digitalWrite(przekaznik12V, HIGH);
  digitalWrite(zmiana1, HIGH);
  digitalWrite(zmiana2, HIGH);
  lcd.init();
  lcd.backlight();
  lcd.begin(16, 2);
  lcd.home();
  lcd.setCursor(3, 0);
  lcd.print("GENERATOR");
   lcd.setCursor(3, 1);
  lcd.print("WITAM");

  czas = millis();
  start = millis();
//   lcd.setCursor(3, 0);
//  lcd.print("GENERATOR");
  delay(2500);
}


void loop()
{

  lcd.setCursor(0, 0);
  lcd.print("MENU WYBORU");
  if (pop != ak) {
    //          lcd.begin(16, 2);
    lcd.home();
    pokazSerial();  // aby nie śmiecić na serialu, wyświetlam tylko zmiany :-)
    pop = ak;

  }
  delay(120);

  switch (co())
  {
    case 8:
      {
        wybor_pradu();
        przel();
      }
      break;
    case 9:
      {
        wybor_pradu();
        przel();
      }
      break;
    case 10:
      {
        wybor_pradu();
        przel();
      }
      break;
    case 11:
      {
        wybor_pradu();
        przel();
      }
      break;
  }
}
 
Odpowiedź
#2
(13-04-2020, 19:04)bo_box napisał(a): ...cokolwiek bym nie wybrał (napięcie z menu) to zmiana zachodzi wyłącznie na pinie 11...

A jaka zmiana ma zajść i na jakim pinie, gdy cokolwiek byś wybrał? Proszę wskazać konkretne miejsce w programie.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
(13-04-2020, 19:40)Robson Kerman napisał(a):
(13-04-2020, 19:04)bo_box napisał(a): ...cokolwiek bym nie wybrał (napięcie z menu) to zmiana zachodzi wyłącznie na pinie 11...

A jaka zmiana ma zajść i na jakim pinie, gdy cokolwiek byś wybrał? Proszę wskazać konkretne miejsce w programie.


No więc tak,
wybieram w menu tryb ręczny >>  czas zmiany >> napięcie po wyborze powinno odnieść się do:

void wybor_pradu()
{
  if (napiecie = 32)
  {
    digitalWrite(przekaznik32V, LOW);
    digitalWrite(przekaznik24V, HIGH);
    digitalWrite(przekaznik18V, HIGH);
    digitalWrite(przekaznik12V, HIGH);
  }
  if (napiecie = 24)
  {
    digitalWrite(przekaznik32V, HIGH);
    digitalWrite(przekaznik24V, LOW);
    digitalWrite(przekaznik18V, HIGH);
    digitalWrite(przekaznik12V, HIGH);
  }
  if (napiecie = 18)
  {
    digitalWrite(przekaznik32V, HIGH);
    digitalWrite(przekaznik24V, HIGH);
    digitalWrite(przekaznik18V, LOW);
    digitalWrite(przekaznik12V, HIGH);
  }

  if (napiecie = 12)
  {
    digitalWrite(przekaznik32V, HIGH);
    digitalWrite(przekaznik24V, HIGH);
    digitalWrite(przekaznik18V, HIGH);
    digitalWrite(przekaznik12V, LOW);
  }
}

jednak cokolwiek bym nie wybrał w menu to tylko Pin 11 zmienia stan na niski.
A tutaj wybieram napięcie:

if (poziom == 2 && ak == 8)
      {
        napiecie = 32;
        return ak;
      }
      if (poziom == 2 && ak == 9)
      {
        napiecie = 24;
        return ak;
      }
      if (poziom == 2 && ak == 10)
      {
        napiecie = 18;
        return ak;
      }
      if (poziom == 2 && ak == 11)
      {
        napiecie = 12;
        return ak;
      }

a jeżeli chodzi o akcję to
jeżeli wybiorę napiecie = 32 to 
    digitalWrite(przekaznik32V, LOW);
    digitalWrite(przekaznik24V, HIGH);
    digitalWrite(przekaznik18V, HIGH);
    digitalWrite(przekaznik12V, HIGH);

 i tak dalej jak napisałem wcześniej kod.
 
Odpowiedź
#4
serial.print twoim przyjacielem i debuggerem...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
W ifacj masz przypisania zamiast porównania.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości