• 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
Jak zmusić uC do oczekiwania na argument (przycisk)
#21
Ogórki posadzone Smile

Takie coś wymodziłem, sprawdziłem i wydaje mi się, że działa.

Kod:
//#include <LiquidCrystal.h> //Dołączenie bilbioteki

//LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);



// przykładowe przypisanie pinów
#define PWM1 3 //nie analizowałem czy na tych pinach działa PWM
#define PWM2 5 //nie analizowałem czy na tych pinach działa PWM
#define PWM3 6 //nie analizowałem czy na tych pinach działa PWM
#define PWM4 9 //nie analizowałem czy na tych pinach działa PWM
#define PWM5 10 //nie analizowałem czy na tych pinach działa PWM
#define PWM6 11


byte p = 0;
byte programowanie = 0;
int pwm1 = 0;
int pwm2 = 0;
int pwm3 = 0;
int pwm4 = 0;
int pwm5 = 0;
int pwm6 = 0;


void setup()
{
  pinMode(4, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP); //pelni funkcje OK
  lcd.init();
  lcd.backlight();
  //lcd.begin(16, 2);
  //lcd.clear();
}

void loop()
{
  // tu leci sobie program
  analogWrite(PWM1, pwm1);
  analogWrite(PWM2, pwm2);
  analogWrite(PWM3, pwm3);
  analogWrite(PWM4, pwm4);
  analogWrite(PWM5, pwm5);
  analogWrite(PWM6, pwm6);

  if (programowanie == 0)
  {
    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Nacisnij przyc."); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("programuj"); //Wyświetlenie tekstu
  }

  if (digitalRead(4) == LOW) // naciskasz przycisk programowanie
  {
    delay(20); // tak na początek czekamy aby ominąć drganie styków potem coś zmienimy
    if (digitalRead(4) == LOW && p == 0 )
    {
      p = 1;
      programowanie = programowanie + 1;// inkrementujesz stan flagi programowanie
      lcd.clear();
      if (programowanie == 7)
      {
        programowanie = 0;
      }
    }
  }
  if (digitalRead(4) == HIGH && p == 1 )
  {
    p = 0;
  }

  // podprogram do ustawiania pwm1 --------------------------------

  if (programowanie == 1) // Przechodzimy do programowania pwm1
  {

    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Ustaw czujnik 1"); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("PWM "); //Wyświetlenie tekstu
    lcd.setCursor(4, 1);
    lcd.print("    ");
    lcd.setCursor(4, 1);
    lcd.print(pwm1);
    lcd.setCursor(8, 1);
    lcd.print("PWMU ");
    lcd.setCursor(12, 1);
    lcd.print("    ");
    lcd.setCursor(13, 1);
    lcd.print(analogRead(A3)); //Wyświetlenie tekstu


    if (digitalRead(7) == LOW)
    {
      pwm1 = analogRead(A3);
    }
  }

  // podprogram do ustawiania pwm2 --------------------------------

  if (programowanie == 2) // Przechodzimy do programowania pwm2
  {

    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Ustaw czujnik 2"); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("PWM "); //Wyświetlenie tekstu
    lcd.setCursor(4, 1);
    lcd.print("    ");
    lcd.setCursor(4, 1);
    lcd.print(pwm2);
    lcd.setCursor(8, 1);
    lcd.print("PWMU ");
    lcd.setCursor(12, 1);
    lcd.print("    ");
    lcd.setCursor(13, 1);
    lcd.print(analogRead(A3)); //Wyświetlenie tekstu


    if (digitalRead(7) == LOW)
    {
      pwm2 = analogRead(A3);
    }
  }
  // podprogram do ustawiania pwm3 --------------------------------
  if (programowanie == 3) // Przechodzimy do programowania pwm2
  {

    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Ustaw czujnik 3"); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("PWM "); //Wyświetlenie tekstu
    lcd.setCursor(4, 1);
    lcd.print("    ");
    lcd.setCursor(4, 1);
    lcd.print(pwm3);
    lcd.setCursor(8, 1);
    lcd.print("PWMU ");
    lcd.setCursor(12, 1);
    lcd.print("    ");
    lcd.setCursor(13, 1);
    lcd.print(analogRead(A3)); //Wyświetlenie tekstu


    if (digitalRead(7) == LOW)
    {
      pwm3 = analogRead(A3);
    }
  }
  // podprogram do ustawiania pwm4 --------------------------------
  if (programowanie == 4) // Przechodzimy do programowania pwm2
  {

    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Ustaw czujnik 4"); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("PWM "); //Wyświetlenie tekstu
    lcd.setCursor(4, 1);
    lcd.print("    ");
    lcd.setCursor(4, 1);
    lcd.print(pwm4);
    lcd.setCursor(8, 1);
    lcd.print("PWMU ");
    lcd.setCursor(12, 1);
    lcd.print("    ");
    lcd.setCursor(13, 1);
    lcd.print(analogRead(A3)); //Wyświetlenie tekstu


    if (digitalRead(7) == LOW)
    {
      pwm4 = analogRead(A3);
    }
  }
  // podprogram do ustawiania pwm5 --------------------------------
  if (programowanie == 5) // Przechodzimy do programowania pwm2
  {

    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Ustaw czujnik 5"); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("PWM "); //Wyświetlenie tekstu
    lcd.setCursor(4, 1);
    lcd.print("    ");
    lcd.setCursor(4, 1);
    lcd.print(pwm5);
    lcd.setCursor(8, 1);
    lcd.print("PWMU ");
    lcd.setCursor(12, 1);
    lcd.print("    ");
    lcd.setCursor(13, 1);
    lcd.print(analogRead(A3)); //Wyświetlenie tekstu


    if (digitalRead(7) == LOW)
    {
      pwm5 = analogRead(A3);
    }
  }
  // podprogram do ustawiania pwm6 --------------------------------
  if (programowanie == 6) // Przechodzimy do programowania pwm2
  {

    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Ustaw czujnik 6"); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("PWM "); //Wyświetlenie tekstu
    lcd.setCursor(4, 1);
    lcd.print("    ");
    lcd.setCursor(4, 1);
    lcd.print(pwm6);
    lcd.setCursor(8, 1);
    lcd.print("PWMU ");
    lcd.setCursor(12, 1);
    lcd.print("    ");
    lcd.setCursor(13, 1);
    lcd.print(analogRead(A3)); //Wyświetlenie tekstu


    if (digitalRead(7) == LOW)
    {
      pwm6 = analogRead(A3);
    }
  }
}
Trzeba oczywiście dodać przelicznik do odczytów z A3.
 
Odpowiedź
#22
Zamiast tych dziesiątek print " ", setcursor wystarczy sprintf . Kod zmieszy się pewnie o 20%.
 
Odpowiedź
#23
Faktycznie kod po użyciu sprintf będzie czytelniejszy i ładniejszy.
Ale niestety program zajmie o wiele więcej pamięci - wcale nie zmniejszy się o 20%, ale zwiększy o 50%.
Straszne są te porady początkujących programistów, to co warto zapamiętać:
użycie printf i sprintf jest wygodne ale bardzo "drogie". Są to niesamowicie rozbudowane funkcje i ich użycie powoduje dodanie do kodu wynikowego ogromnej ilości kodu z biblioteki standardowej języka C. Więc w przypadku systemów wbudowanych najlepiej ich nie używać - są nie tylko zasobożerne i mało wydajne, ale do tego potencjalnie niebezpieczne.
 
Odpowiedź
#24
Sprintf dla AVR zajmuje ok 1kB. Jaki to problem dla UNO?
 
Odpowiedź
#25
Dajcie przykład jak użyć tych sprintfów i printfów to sprawdzę jaka jest różnica w zajętości pamięci.
Jestem dość długo początkujący i z racji lasowanie się tego co zwykle jest między uszami ciężko mi jest to ogarnąć.
Pozdrawiam
 
Odpowiedź
#26
Skompilowałem program wcześniej - wersja bez sprintf zajmuje ok. 4.5KB, po użyciu sprintf ponad 6KB. Jest to mniej niż 50% ale w tym przypadku marnowanie pamięci jest znaczące.
 
Odpowiedź
#27
Zmodyfikowałem i trochę odchudziłem program:

Kod:
//#include <LiquidCrystal.h> //Dołączenie bilbioteki

//LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza


#include <LiquidCrystal_I2C.h> //biblioteka do wyświetlacza po I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // deklaracja adresu i rozmiaru wyświetlacza



// przykładowe przypisanie pinów
#define PWM1 3 //nie analizowałem czy na tych pinach działa PWM
#define PWM2 5 //nie analizowałem czy na tych pinach działa PWM
#define PWM3 6 //nie analizowałem czy na tych pinach działa PWM
#define PWM4 9 //nie analizowałem czy na tych pinach działa PWM
#define PWM5 10 //nie analizowałem czy na tych pinach działa PWM
#define PWM6 11


byte p = 0; // flaga do przycisku programowania
byte programowanie = 0;
int pwm1 = 0;
int pwm2 = 0;
int pwm3 = 0;
int pwm4 = 0;
int pwm5 = 0;
int pwm6 = 0;
int pwm0 = 0; // zmienna pomocnicza potrzebna do wyświetlania

void setup()
{
  pinMode(4, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP); //pelni funkcje OK
  lcd.init(); // uruchomienie wyświetlacza
  lcd.backlight(); // i takie tam
 
  //lcd.begin(16, 2);
  //lcd.clear();
}

void loop()
{
  // tu leci sobie program
  analogWrite(PWM1, pwm1);
  analogWrite(PWM2, pwm2);
  analogWrite(PWM3, pwm3);
  analogWrite(PWM4, pwm4);
  analogWrite(PWM5, pwm5);
  analogWrite(PWM6, pwm6);

  if (programowanie == 0)
  {
    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Nacisnij przyc."); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("programuj"); //Wyświetlenie tekstu
  }

  if (digitalRead(4) == LOW) // naciskasz przycisk programowanie
  {
    delay(20); // tak na początek czekamy aby ominąć drganie styków potem coś zmienimy
    if (digitalRead(4) == LOW && p == 0 )
    {
      p = 1; // flaga, taka zmienna aby wpadać w ten if tylko raz
      programowanie = programowanie + 1;// inkrementujesz stan flagi programowanie
      lcd.clear(); // zeruję wyświetlacz
      if (programowanie == 7) // powrót do początku czyli
      {
        programowanie = 0;// ustawienie zmiennej programowanie na 0
      }
    }
  }
  if (digitalRead(4) == HIGH && p == 1 )
  {
    p = 0; // jak puścimy przycisk programowania to zmieniamy flagę na 0
           // aby przy następnym przyciśnięciu "wstąpić" do wcześniejszego ifa
  }


  if (programowanie == 1)
  {
    pwm0 = pwm1; // przypisanie zmiennej pwm1 do pwm0, potrzebne do wyświetlacza
    wyswietlacz();
    if (digitalRead(7) == LOW)
    {
      pwm1 = analogRead(A3);
    }
  }
  if (programowanie == 2)
  {
    pwm0 = pwm2; // jak powyżej tylko pwm2
    wyswietlacz();
    if (digitalRead(7) == LOW)
    {
      pwm2 = analogRead(A3);
    }
  }
  if (programowanie == 3)
  {
    pwm0 = pwm3;// jak powyżej tylko pwm3
    wyswietlacz();
    if (digitalRead(7) == LOW)
    {
      pwm3 = analogRead(A3);
    }
  }
  if (programowanie == 4)
  {
    pwm0 = pwm4;// jak powyżej tylko pwm4
    wyswietlacz();
    if (digitalRead(7) == LOW)
    {
      pwm4 = analogRead(A3);
    }
  }
  if (programowanie == 5)
  {
    pwm0 = pwm5;// jak powyżej tylko pwm5
    wyswietlacz();
    if (digitalRead(7) == LOW)
    {
      pwm5 = analogRead(A3);
    }
  }
  if (programowanie == 6)
  {
    pwm0 = pwm6;// jak powyżej tylko pwm6
    wyswietlacz();
    if (digitalRead(7) == LOW)
    {
      pwm6 = analogRead(A3);
    }
  }
}


void wyswietlacz()
{
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("Ustaw czujnik "); //Wyświetlenie tekstu
  lcd.print(programowanie);
  lcd.setCursor(0, 1); //Ustawienie kursora
  lcd.print("PWM "); //Wyświetlenie tekstu
  lcd.setCursor(4, 1);
  lcd.print("    ");
  lcd.setCursor(4, 1);
  lcd.print(pwm0);
  lcd.setCursor(8, 1);
  lcd.print("PWMU ");
  lcd.setCursor(12, 1);
  lcd.print("    ");
  lcd.setCursor(13, 1);
  lcd.print(analogRead(A3)); //Wyświetlenie tekstu
}
 
Odpowiedź
#28
(09-05-2020, 18:18)elvis napisał(a): Skompilowałem program wcześniej - wersja bez sprintf zajmuje ok. 4.5KB, po użyciu sprintf ponad 6KB. Jest to mniej niż 50% ale w tym przypadku marnowanie pamięci jest znaczące.
1,5 kB bo pewnie nie ustawiłeś odpowiednio opcji kompilacji ale nie martw się, od początkującego nie można zbyt dużo wymagać. Douczysz się i będziesz wiedział jak korzystać z możliwości kompilatora i wbudowanych funkcji.
 
Odpowiedź
#29
SaS już kiedyś Ci pisałem, tu jest piaskownica, jak możesz pomóc to napisz coś konkretnego, daj przykład jak zmienić kod aby było lepiej, przejrzyściej, bardziej zrozumiałe dla początkujących.
Pokaż gdzie co "nadusić" w kompilatorze, dlaczego tak to proponujesz., co to daje.
 
Odpowiedź
#30
@Agregacik, nie licz na jakiekolwiek sensowne porady od @SaS-a. Widać że pisze o rzeczach, o których nie ma pojęcia. Arduino domyślnie ma włączoną optymalizację wielkości kodu, czyli -Os, natomiast użycie printf jest po prostu kosztowene. @SaS napisał bzdurę i zamiast się do tego przyznać to brnie dalej.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości