• 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
LCD IC2 4x20 wyświetla tylko pierwsze litery
#31
(28-12-2020, 13:21)Himura Kenshin napisał(a): Daj jakiś przykład prostego menu.
Chcesz przykład prostego menu. Nie mam "pod ręką" prostego menu. Musiałbym go napisać a do tego zbudować makietę aby sprawdzić czy działa. Mogę zawsze zrobić jakiegoś babola i może nie zadziałać tak jak chcę. Jak robię coś, to od razu muszę sprawdzać czy to działa.

Wybacz, ale Twój kod pokazuje, że nie masz podstaw i nie rozumiesz co piszesz w kodzie.
Poniżej masz kod gdzie występują elementy menu. Jest to sterownik a właściwie stacja meteo (jej jedna część).
Do ustawienia jest temperatura zadana temperatury w pomieszczeniu oraz poziom PMów do wyłączenia rekuperatora jak przekroczy zadaną wartość zapylenie na zewnątrz.

Kod:
/* Uwaga
*  Podczas pierwszego wgrywania oprogramowania do mikrokontrolera
*  odkomentój zaznaczone linie w setup.
*  Potem wgraj ponownie oprogramowanie z zakomentowanymi liniami.
*  Uchroni to przed nieprawidłowym działaniem programu,
*  związane jest to z nieprawidłowym odczytem wartości z pamięci.
*  Prawidłowe wstępne wpisanie danych umożliwia poprawne działanie
*  programu.
*  Dla dociekliwych
*  Dziewiczy procesor ma w pamięci zapisane same FF co powoduje
*  błędny odczyt zmiennej float z pamięci.
*  *
*/


#define PMG A2
#define PMD A3
#define TwG 3
#define TwD 2
#define SterTw 4
#define Rx1 A0
#define Tx1 A1

#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4); // ustawienie wyświetlacza adres 0x3F
//LiquidCrystal_I2C lcd(0x27,20,4);  // ustawienie wyświetlacza adres 0x27

//----------------------------------------------------------
//Do czujnika ciśnienia, temperatury i wilgotności wewnętrznej

#include <Adafruit_BME280.h>

//#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C

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

// Programowy UART
#include <SoftwareSerial.h>
SoftwareSerial S1(Rx1, Tx1);//Serial nazywa się S1 RX, TX

int licznik = 0;

int FiltrZad = 5 ;
unsigned int PMZad = 100 ;
float TwZad = 20 ;

int FiltrZadZap ;
unsigned int PMZadZap ;
float TwZadZap ;

int miganie = LOW ;
int filtry = 0;
int przycisk = 0; //zmienna informująca o trybie przycisków

int AddresPMZadZap = 0;
int AddresTwZadZap = 10;
int AddresFiltrZadZap = 20;

byte stopien[8] = //generowanie znaku stopnia na wyswietlaczu
{
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
  B00000
};
byte mig[8] = //generowanie znaku migania na wyswietlaczu
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000
};

unsigned long ZapCzasOdczytuCzuj ;
unsigned long CzasDoZap ;

  float CisAtm ;
  float WilgWew ;
  float TempWew ;
 
  //Daklaracja struktur (łatwo się je wysyła i odbiera przez UART przez zamianę w string)
 
  //Struktura danych do wysłania
 
    struct Nadawanie{
    unsigned int PMZad = 300  ;
    } DaneDoWyslania;
   
  //Struktura danych odebranych
 
    struct Odbior{
      byte SterRek = 1 ;
      int stan ;
      float PmZew ;
      float PmWew ;
      float WilgZew ;
      float TempZew ;
      } DaneOdebrane;
 
  char StringOdebrany[sizeof(DaneOdebrane)]; //Deklaracja stringa odebranego
  char StringDoNadania[sizeof(DaneDoWyslania)]; //Deklaracja stringa do nadania
 

void setup()
{
  //-----------------------------------------------------------
  // do czujnika ciśnienia
 
    bme.begin(); //uruchomienie czujnika
     
  //------------------------------------------------------------
  pinMode(PMG, INPUT_PULLUP);
  pinMode(PMD, INPUT_PULLUP);
  pinMode(TwG, INPUT_PULLUP);
  pinMode(TwD, INPUT_PULLUP);
  pinMode(SterTw, OUTPUT );

  lcd.init();                 
  lcd.backlight();
  lcd.createChar(0, stopien);//kreowanie znaku stopnia na lcd
  lcd.createChar(1, mig);
  lcd.clear(); // zerowanie wyświetlacza

  //**********************************************************************

  //**********************************************************************

  // sprawdzamy co jest w pamięci FiltrZadZap
  EEPROM.get(AddresFiltrZadZap, FiltrZadZap); //Odczyt z pamięci
  // wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 0);
  lcd.print("Info filtry ");
  lcd.print(FiltrZadZap);
  delay (3000);
  lcd.setCursor(11, 0);
  lcd.print("          ");
  delay (1000);
  if (FiltrZadZap > 20 || FiltrZadZap <0) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
  {
    FiltrZadZap = 5;
    EEPROM.put(AddresFiltrZadZap, FiltrZadZap); // jeśli wartość jest większa od 20 to wpisz do pomięci wartość 5
  }
  EEPROM.get(AddresFiltrZadZap, FiltrZadZap); // Odczyt z pamięci
  // Ponownie wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 0);
  lcd.print("Info filtry ");
  lcd.print(FiltrZadZap);
  delay (1000);
  FiltrZad = FiltrZadZap;

   
  //*******************************************************************
  //Poniższą linijkę odkomentój przy pierwszym wgrywaniu oprogramowania
  //PMZadZap = 10000; EEPROM.put(AddresPMZadZap, PMZadZap);
  //*******************************************************************
 
  //Sprawdzamy co jest w pamięci PMZadZap
  EEPROM.get(AddresPMZadZap, PMZadZap); //Odczyt z pamięci
  // wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 1);
  lcd.print("PM Zadane ");
  lcd.print(PMZadZap);
  lcd.print(" %");
  delay (3000);
  lcd.setCursor(10, 1);
  lcd.print("          ");
  delay (1000);
 
  if (PMZadZap > 1000 || PMZadZap <20) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
  {
    PMZadZap = 100;
    EEPROM.put(AddresPMZadZap, PMZadZap); // jeśli wartość jest większa od 1000 to wpisz do pomięci wartość 100
  }
  EEPROM.get(AddresPMZadZap, PMZadZap); // Odczyt z pamięci
  // Ponownie wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 1);
  lcd.print("PM Zadane ");
  lcd.print(PMZadZap);
  lcd.print(" %");
  delay (1000);
  PMZad = PMZadZap;
 
  //************************************************************************
  //Poniższą linijkę odkomentój przy pierwszym wgrywaniu oprogramowania
  //TwZadZap = 85.5; EEPROM.put(AddresTwZadZap, TwZadZap);
 
  //************************************************************************
 
  //Sprawdzamy co jest w pamięci TwZadZap

  EEPROM.get(AddresTwZadZap, TwZadZap); //Odczyt z pamięci
// wyświetlamy to na wyświetlaczu 
  lcd.setCursor(0, 2);
  lcd.print("Tw Zadana ");
  lcd.print(TwZadZap,1);
  lcd.write (0);
  lcd.print("C");
  delay (3000);
  lcd.setCursor(10, 2);
  lcd.print("          ");
  delay (1000);
 
  if (TwZadZap > 30 || TwZadZap <10) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
  {
  TwZadZap = 20;
  EEPROM.put(AddresTwZadZap, TwZadZap); // jeśli wartość jest większa od 30 to wpisz do pomięci wartość 20
 
  }
 
  EEPROM.get(AddresTwZadZap, TwZadZap);
 
  // Ponownie wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 2);
  lcd.print("Tw Zadana ");
  lcd.print(TwZadZap,1);
  lcd.write (0);
  lcd.print("C");

  TwZad =  TwZadZap;

  delay (5000); //Czekamy dla poczytania
  lcd.clear(); // zerowanie wyświetlacza
 
  S1.begin (9600);
   
}

void loop()
{
  if ( millis() < CzasDoZap  )
  {
    CzasDoZap = 0;
  }
 
  if ( millis() < ZapCzasOdczytuCzuj )
  {
    ZapCzasOdczytuCzuj = 0;
  }
 
  if(S1.available()>0)
  {
    delay (100);
    if(S1.available()==sizeof(DaneOdebrane))
    {
      readserial_S1 ();
      DaneDoWyslania.PMZad = PMZad ;
      writeserial_S1();
      sprawdzFiltry ();
      miganie = !miganie ;
      wyswietlacz ();
    }
    else
      {
        while (S1.available()> 0)
        {
        int czyszczenie = S1.read();
        }
      }
  }
  odczytaj_czujniki ();
 
  if (przycisk == 0)
  {
    Przyciski ();
  }
  if (przycisk == 1)
  {
    UstawFiltry ();
  }
  if (przycisk == 2)
  {
    UstawPMZad ();
  }
  if (przycisk == 3)
  {
    UstawTwZad ();
  }
}


void readserial_S1 ()
  {
  S1.readBytes(StringOdebrany,sizeof(DaneOdebrane));
  memcpy(&DaneOdebrane,StringOdebrany,sizeof(DaneOdebrane));
  }
 
void writeserial_S1()
  {
  memcpy(StringDoNadania,&DaneDoWyslania,sizeof(DaneDoWyslania));
  S1.write(StringDoNadania,sizeof(DaneDoWyslania));
   
  }

void Przyciski ()
{
    if ( (digitalRead(PMG) == LOW) || (digitalRead(PMD) == LOW) || (digitalRead(TwG) == LOW) || (digitalRead(TwD) == LOW ) )
    {
    delay (500);
    if ( (digitalRead(PMG) == LOW) && (digitalRead(TwD) == LOW) )
      {
      przycisk = 1;
      CzasDoZap = millis ();
      return;
      }
    if ( (digitalRead(PMG) == LOW) || (digitalRead(PMD) == LOW) )
    {
      przycisk = 2;
      CzasDoZap = millis ();
      return;
    }
    if ( (digitalRead(TwG) == LOW) || (digitalRead(TwD) == LOW) )
    {
      przycisk = 3;
      CzasDoZap = millis ();
      return;
    }
   
    }
}


void UstawPMZad ()
{   
      if ( (digitalRead(PMG) == LOW) && (PMZad < 1000) && (licznik > 0 ) )
      {
        PMZad = PMZad + 10 ;
        CzasDoZap = millis ();
      }
   
      if ( (digitalRead(PMD) == LOW) && (PMZad > 20)&& (licznik > 0 ) )
      {
      PMZad = PMZad - 10 ;
      CzasDoZap = millis ();
      }
      if ( (digitalRead(PMG) == HIGH) && (digitalRead(PMD) == HIGH) )
      {
      licznik = licznik + 1;
      }
     
     
      lcd.setCursor(3, 1);
      lcd.print("      ");
      lcd.setCursor(3, 1);
      lcd.print("z");
      lcd.setCursor(4, 1);
      lcd.print(PMZad);
      lcd.print("%");
      delay (500);

  if ( (digitalRead(PMG) == HIGH) && (digitalRead(PMD) == HIGH) && (( millis() - CzasDoZap ) >= 5000UL ))
  {
    licznik = 0;
    przycisk = 0;
    if ( PMZad != PMZadZap )
    {
    EEPROM.put(AddresPMZadZap, PMZad); //Zapis do pamięci
    lcd.setCursor(3, 1);
    lcd.print("    ");
    delay (500);
    EEPROM.get(AddresPMZadZap, PMZadZap); // Odczyt z pamięci
    lcd.setCursor(4, 1);
    lcd.print(PMZadZap);
    lcd.print("%");
    delay (1000);
    }
   
  }
}

void UstawTwZad ()
{   
      if ( (digitalRead(TwG) == LOW) && (TwZad < 30) && (licznik > 0 ) )
      {
        TwZad = TwZad + 0.5 ;
        CzasDoZap = millis ();
      }
   
      if ( (digitalRead(TwD) == LOW) && (TwZad > 10)&& (licznik > 0 ) )
      {
      TwZad = TwZad - 0.5 ;
      CzasDoZap = millis ();
      }
      if (( (digitalRead(TwG) == HIGH) && (digitalRead(TwD) == HIGH) ))
      {
      licznik = licznik + 1;
      }
     
      lcd.setCursor(12, 3);
      lcd.print("    ");
      lcd.setCursor(12, 3);
      lcd.print("z");
      lcd.setCursor(13, 3);
      lcd.print(TwZad , 1);
      lcd.write (0);
      lcd.print("C");
      delay (500);

  if (( (digitalRead(TwG) == HIGH) && (digitalRead(TwD) == HIGH) )&& (( millis() - CzasDoZap ) >= 5000UL ))
  {
      licznik = 0;
      przycisk = 0;
  if ( TwZad != TwZadZap )
  {
   
    EEPROM.put(AddresTwZadZap, TwZad); //Zapis do pamięci
    lcd.setCursor(13, 3);
    lcd.print("      ");
 
    delay (500);
 
    EEPROM.get(AddresTwZadZap, TwZadZap); // Odczyt z pamięci
    lcd.setCursor(13, 3);
    lcd.print(TwZadZap , 1);
    lcd.write (0);
    lcd.print("C");
    delay (1000);
  }

  }
}

void UstawFiltry ()
{
if ( (digitalRead(TwG) == LOW) && (FiltrZad < 20) && (licznik > 0 ) )
      {
        FiltrZad = FiltrZad + 1 ;
        CzasDoZap = millis ();
      }
   
      if ( (digitalRead(PMD) == LOW) && (FiltrZad > 0)&& (licznik > 0 ) )
      {
      FiltrZad = FiltrZad - 1 ;
      CzasDoZap = millis ();
      }
      if (( (digitalRead(TwD) == HIGH) && (digitalRead(PMG) == HIGH) ))
      {
      licznik = licznik + 1;
      }
     
      lcd.setCursor(0, 0);
      lcd.print("Ust. info filtra  ");
      lcd.setCursor(17, 0);
      lcd.print(FiltrZad);

      delay (500);
     
     
  if (( (digitalRead(TwD) == HIGH) && (digitalRead(PMG) == HIGH) )&& (( millis() - CzasDoZap ) >= 5000UL ))
  {
      licznik = 0;
      przycisk = 0;
  if ( FiltrZad != FiltrZadZap )
  {
    EEPROM.put(AddresFiltrZadZap, FiltrZad); //Zapis do pamięci
   
    delay (500);
 
    EEPROM.get(AddresFiltrZadZap, FiltrZadZap); // Odczyt z pamięci
 
    delay (1000);
  }
  }
}


void SterTempWew ()
{

  if (TempWew < (TwZad - 0.2) )
  {
    digitalWrite(SterTw, HIGH);
    lcd.setCursor(9, 3);
    lcd.print("#");
  }
  if (TempWew > (TwZad + 0.2) )
  {
    digitalWrite(SterTw, LOW);
    lcd.setCursor(9, 3);
    lcd.print(" ");
  }
}

void sprawdzFiltry ()
{
  if (DaneOdebrane.PmWew * FiltrZad > DaneOdebrane.PmZew  && DaneOdebrane.PmWew > 20 && FiltrZad >0)
  {
    filtry = 1;
  }
  else
  {
    filtry = 0;
  }
}

void wyswietlacz ()

{
  if (przycisk == 0 )
  {
// 1 linijka
if ( filtry == 0 ||(filtry == 1 && miganie == LOW ))
{
  lcd.setCursor(0, 0);
  lcd.print("Pa        ");
  lcd.setCursor(3, 0);
  lcd.print(CisAtm,0);
  lcd.print("hPa");
  lcd.setCursor(10, 0);
  lcd.print("REK ");
  if (DaneOdebrane.SterRek == 1)
  {
    lcd.print("START");
  }
  if (DaneOdebrane.SterRek == 0)
  {
    lcd.print("STOP ");
  }
}
if (filtry == 1 && miganie == HIGH )
  {
  lcd.setCursor(0, 0);
  lcd.print("  SPRAWDZ FILTRY  ");
  }


  lcd.setCursor(19, 0); //Ustawienie kursora
  if (miganie == LOW )
  {
    lcd.write (1);
  }
  if (miganie == HIGH )
  {
    lcd.print(" ");
  }
// 2 linijka
  lcd.setCursor(0, 1);
  lcd.print("PMz      ");
  lcd.setCursor(4, 1);
  lcd.print(DaneOdebrane.PmZew,0);
  lcd.print("%");
 
  lcd.setCursor(10, 1);
  lcd.print("PMn      ");
  lcd.setCursor(14, 1);
  lcd.print(DaneOdebrane.PmWew,0);
  lcd.print("%");


  lcd.setCursor(19, 1);
  if (DaneOdebrane.stan == 0)
  {
    lcd.print("W");
  }
  if (DaneOdebrane.stan == 2)
  {
    lcd.print("P");
  }
  if (DaneOdebrane.stan == 4)
  {
    lcd.print("S");
  }
 

 
// 3 linijka
  lcd.setCursor(0, 2);
  lcd.print("Wz        ");
  lcd.setCursor(3, 2);
  lcd.print(DaneOdebrane.WilgZew, 0);
  lcd.print("%");
  lcd.setCursor(10, 2);
  lcd.print("Tz        ");
  lcd.setCursor(13, 2);
  lcd.print(DaneOdebrane.TempZew, 1 );
  lcd.write (0);
  lcd.print("C");

 
// 4 linijka
  lcd.setCursor(0, 3);
  lcd.print("Ww      ");
  lcd.setCursor(3, 3);
  lcd.print(WilgWew, 0);
  lcd.print("%");
  lcd.setCursor(10, 3);
  lcd.print("Tw        ");
  lcd.setCursor(13, 3);
  lcd.print(TempWew, 1 );
  lcd.write (0);
  lcd.print("C");
  }
}

void odczytaj_czujniki ()
{
  if ( millis() - ZapCzasOdczytuCzuj >= 30000UL )
  {
  bme.begin();
  ZapCzasOdczytuCzuj = millis();
  TempWew = bme.readTemperature();
  WilgWew = bme.readHumidity();
  CisAtm = (bme.readPressure() / 100.0F);
  SterTempWew ();
  }
}
 
Odpowiedź
#32
(28-12-2020, 14:58)Agregacik napisał(a):
(28-12-2020, 13:21)Himura Kenshin napisał(a): Daj jakiś przykład prostego menu.
Chcesz przykład prostego menu. Nie mam "pod ręką" prostego menu. Musiałbym go napisać a do tego zbudować makietę aby sprawdzić czy działa. Mogę zawsze zrobić jakiegoś babola i może nie zadziałać tak jak chcę. Jak robię coś, to od razu muszę sprawdzać czy to działa.

Wybacz, ale Twój kod pokazuje, że nie masz podstaw i nie rozumiesz co piszesz w kodzie.
Poniżej masz kod gdzie występują elementy menu. Jest to sterownik a właściwie stacja meteo (jej jedna część).
Do ustawienia jest temperatura zadana temperatury w pomieszczeniu oraz poziom PMów do wyłączenia rekuperatora jak przekroczy zadaną wartość zapylenie na zewnątrz.

Kod:
/* Uwaga
*  Podczas pierwszego wgrywania oprogramowania do mikrokontrolera
*  odkomentój zaznaczone linie w setup.
*  Potem wgraj ponownie oprogramowanie z zakomentowanymi liniami.
*  Uchroni to przed nieprawidłowym działaniem programu,
*  związane jest to z nieprawidłowym odczytem wartości z pamięci.
*  Prawidłowe wstępne wpisanie danych umożliwia poprawne działanie
*  programu.
*  Dla dociekliwych
*  Dziewiczy procesor ma w pamięci zapisane same FF co powoduje
*  błędny odczyt zmiennej float z pamięci.
*  *
*/


#define PMG A2
#define PMD A3
#define TwG 3
#define TwD 2
#define SterTw 4
#define Rx1 A0
#define Tx1 A1

#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4); // ustawienie wyświetlacza adres 0x3F
//LiquidCrystal_I2C lcd(0x27,20,4);  // ustawienie wyświetlacza adres 0x27

//----------------------------------------------------------
//Do czujnika ciśnienia, temperatury i wilgotności wewnętrznej

#include <Adafruit_BME280.h>

//#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C

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

// Programowy UART
#include <SoftwareSerial.h>
SoftwareSerial S1(Rx1, Tx1);//Serial nazywa się S1 RX, TX

int licznik = 0;

int FiltrZad = 5 ;
unsigned int PMZad = 100 ;
float TwZad = 20 ;

int FiltrZadZap ;
unsigned int PMZadZap ;
float TwZadZap ;

int miganie = LOW ;
int filtry = 0;
int przycisk = 0; //zmienna informująca o trybie przycisków

int AddresPMZadZap = 0;
int AddresTwZadZap = 10;
int AddresFiltrZadZap = 20;

byte stopien[8] = //generowanie znaku stopnia na wyswietlaczu
{
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
  B00000
};
byte mig[8] = //generowanie znaku migania na wyswietlaczu
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000
};

unsigned long ZapCzasOdczytuCzuj ;
unsigned long CzasDoZap ;

  float CisAtm ;
  float WilgWew ;
  float TempWew ;
 
  //Daklaracja struktur (łatwo się je wysyła i odbiera przez UART przez zamianę w string)
 
  //Struktura danych do wysłania
 
    struct Nadawanie{
    unsigned int PMZad = 300  ;
    } DaneDoWyslania;
   
  //Struktura danych odebranych
 
    struct Odbior{
      byte SterRek = 1 ;
      int stan ;
      float PmZew ;
      float PmWew ;
      float WilgZew ;
      float TempZew ;
      } DaneOdebrane;
 
  char StringOdebrany[sizeof(DaneOdebrane)]; //Deklaracja stringa odebranego
  char StringDoNadania[sizeof(DaneDoWyslania)]; //Deklaracja stringa do nadania
 

void setup()
{
  //-----------------------------------------------------------
  // do czujnika ciśnienia
 
    bme.begin(); //uruchomienie czujnika
     
  //------------------------------------------------------------
  pinMode(PMG, INPUT_PULLUP);
  pinMode(PMD, INPUT_PULLUP);
  pinMode(TwG, INPUT_PULLUP);
  pinMode(TwD, INPUT_PULLUP);
  pinMode(SterTw, OUTPUT );

  lcd.init();                 
  lcd.backlight();
  lcd.createChar(0, stopien);//kreowanie znaku stopnia na lcd
  lcd.createChar(1, mig);
  lcd.clear(); // zerowanie wyświetlacza

  //**********************************************************************

  //**********************************************************************

  // sprawdzamy co jest w pamięci FiltrZadZap
  EEPROM.get(AddresFiltrZadZap, FiltrZadZap); //Odczyt z pamięci
  // wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 0);
  lcd.print("Info filtry ");
  lcd.print(FiltrZadZap);
  delay (3000);
  lcd.setCursor(11, 0);
  lcd.print("          ");
  delay (1000);
  if (FiltrZadZap > 20 || FiltrZadZap <0) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
  {
    FiltrZadZap = 5;
    EEPROM.put(AddresFiltrZadZap, FiltrZadZap); // jeśli wartość jest większa od 20 to wpisz do pomięci wartość 5
  }
  EEPROM.get(AddresFiltrZadZap, FiltrZadZap); // Odczyt z pamięci
  // Ponownie wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 0);
  lcd.print("Info filtry ");
  lcd.print(FiltrZadZap);
  delay (1000);
  FiltrZad = FiltrZadZap;

   
  //*******************************************************************
  //Poniższą linijkę odkomentój przy pierwszym wgrywaniu oprogramowania
  //PMZadZap = 10000; EEPROM.put(AddresPMZadZap, PMZadZap);
  //*******************************************************************
 
  //Sprawdzamy co jest w pamięci PMZadZap
  EEPROM.get(AddresPMZadZap, PMZadZap); //Odczyt z pamięci
  // wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 1);
  lcd.print("PM Zadane ");
  lcd.print(PMZadZap);
  lcd.print(" %");
  delay (3000);
  lcd.setCursor(10, 1);
  lcd.print("          ");
  delay (1000);
 
  if (PMZadZap > 1000 || PMZadZap <20) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
  {
    PMZadZap = 100;
    EEPROM.put(AddresPMZadZap, PMZadZap); // jeśli wartość jest większa od 1000 to wpisz do pomięci wartość 100
  }
  EEPROM.get(AddresPMZadZap, PMZadZap); // Odczyt z pamięci
  // Ponownie wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 1);
  lcd.print("PM Zadane ");
  lcd.print(PMZadZap);
  lcd.print(" %");
  delay (1000);
  PMZad = PMZadZap;
 
  //************************************************************************
  //Poniższą linijkę odkomentój przy pierwszym wgrywaniu oprogramowania
  //TwZadZap = 85.5; EEPROM.put(AddresTwZadZap, TwZadZap);
 
  //************************************************************************
 
  //Sprawdzamy co jest w pamięci TwZadZap

  EEPROM.get(AddresTwZadZap, TwZadZap); //Odczyt z pamięci
// wyświetlamy to na wyświetlaczu 
  lcd.setCursor(0, 2);
  lcd.print("Tw Zadana ");
  lcd.print(TwZadZap,1);
  lcd.write (0);
  lcd.print("C");
  delay (3000);
  lcd.setCursor(10, 2);
  lcd.print("          ");
  delay (1000);
 
  if (TwZadZap > 30 || TwZadZap <10) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
  {
  TwZadZap = 20;
  EEPROM.put(AddresTwZadZap, TwZadZap); // jeśli wartość jest większa od 30 to wpisz do pomięci wartość 20
 
  }
 
  EEPROM.get(AddresTwZadZap, TwZadZap);
 
  // Ponownie wyświetlamy to na wyświetlaczu
  lcd.setCursor(0, 2);
  lcd.print("Tw Zadana ");
  lcd.print(TwZadZap,1);
  lcd.write (0);
  lcd.print("C");

  TwZad =  TwZadZap;

  delay (5000); //Czekamy dla poczytania
  lcd.clear(); // zerowanie wyświetlacza
 
  S1.begin (9600);
   
}

void loop()
{
  if ( millis() < CzasDoZap  )
  {
    CzasDoZap = 0;
  }
 
  if ( millis() < ZapCzasOdczytuCzuj )
  {
    ZapCzasOdczytuCzuj = 0;
  }
 
  if(S1.available()>0)
  {
    delay (100);
    if(S1.available()==sizeof(DaneOdebrane))
    {
      readserial_S1 ();
      DaneDoWyslania.PMZad = PMZad ;
      writeserial_S1();
      sprawdzFiltry ();
      miganie = !miganie ;
      wyswietlacz ();
    }
    else
      {
        while (S1.available()> 0)
        {
        int czyszczenie = S1.read();
        }
      }
  }
  odczytaj_czujniki ();
 
  if (przycisk == 0)
  {
    Przyciski ();
  }
  if (przycisk == 1)
  {
    UstawFiltry ();
  }
  if (przycisk == 2)
  {
    UstawPMZad ();
  }
  if (przycisk == 3)
  {
    UstawTwZad ();
  }
}


void readserial_S1 ()
  {
  S1.readBytes(StringOdebrany,sizeof(DaneOdebrane));
  memcpy(&DaneOdebrane,StringOdebrany,sizeof(DaneOdebrane));
  }
 
void writeserial_S1()
  {
  memcpy(StringDoNadania,&DaneDoWyslania,sizeof(DaneDoWyslania));
  S1.write(StringDoNadania,sizeof(DaneDoWyslania));
   
  }

void Przyciski ()
{
    if ( (digitalRead(PMG) == LOW) || (digitalRead(PMD) == LOW) || (digitalRead(TwG) == LOW) || (digitalRead(TwD) == LOW ) )
    {
    delay (500);
    if ( (digitalRead(PMG) == LOW) && (digitalRead(TwD) == LOW) )
      {
      przycisk = 1;
      CzasDoZap = millis ();
      return;
      }
    if ( (digitalRead(PMG) == LOW) || (digitalRead(PMD) == LOW) )
    {
      przycisk = 2;
      CzasDoZap = millis ();
      return;
    }
    if ( (digitalRead(TwG) == LOW) || (digitalRead(TwD) == LOW) )
    {
      przycisk = 3;
      CzasDoZap = millis ();
      return;
    }
   
    }
}


void UstawPMZad ()
{   
      if ( (digitalRead(PMG) == LOW) && (PMZad < 1000) && (licznik > 0 ) )
      {
        PMZad = PMZad + 10 ;
        CzasDoZap = millis ();
      }
   
      if ( (digitalRead(PMD) == LOW) && (PMZad > 20)&& (licznik > 0 ) )
      {
      PMZad = PMZad - 10 ;
      CzasDoZap = millis ();
      }
      if ( (digitalRead(PMG) == HIGH) && (digitalRead(PMD) == HIGH) )
      {
      licznik = licznik + 1;
      }
     
     
      lcd.setCursor(3, 1);
      lcd.print("      ");
      lcd.setCursor(3, 1);
      lcd.print("z");
      lcd.setCursor(4, 1);
      lcd.print(PMZad);
      lcd.print("%");
      delay (500);

  if ( (digitalRead(PMG) == HIGH) && (digitalRead(PMD) == HIGH) && (( millis() - CzasDoZap ) >= 5000UL ))
  {
    licznik = 0;
    przycisk = 0;
    if ( PMZad != PMZadZap )
    {
    EEPROM.put(AddresPMZadZap, PMZad); //Zapis do pamięci
    lcd.setCursor(3, 1);
    lcd.print("    ");
    delay (500);
    EEPROM.get(AddresPMZadZap, PMZadZap); // Odczyt z pamięci
    lcd.setCursor(4, 1);
    lcd.print(PMZadZap);
    lcd.print("%");
    delay (1000);
    }
   
  }
}

void UstawTwZad ()
{   
      if ( (digitalRead(TwG) == LOW) && (TwZad < 30) && (licznik > 0 ) )
      {
        TwZad = TwZad + 0.5 ;
        CzasDoZap = millis ();
      }
   
      if ( (digitalRead(TwD) == LOW) && (TwZad > 10)&& (licznik > 0 ) )
      {
      TwZad = TwZad - 0.5 ;
      CzasDoZap = millis ();
      }
      if (( (digitalRead(TwG) == HIGH) && (digitalRead(TwD) == HIGH) ))
      {
      licznik = licznik + 1;
      }
     
      lcd.setCursor(12, 3);
      lcd.print("    ");
      lcd.setCursor(12, 3);
      lcd.print("z");
      lcd.setCursor(13, 3);
      lcd.print(TwZad , 1);
      lcd.write (0);
      lcd.print("C");
      delay (500);

  if (( (digitalRead(TwG) == HIGH) && (digitalRead(TwD) == HIGH) )&& (( millis() - CzasDoZap ) >= 5000UL ))
  {
      licznik = 0;
      przycisk = 0;
  if ( TwZad != TwZadZap )
  {
   
    EEPROM.put(AddresTwZadZap, TwZad); //Zapis do pamięci
    lcd.setCursor(13, 3);
    lcd.print("      ");
 
    delay (500);
 
    EEPROM.get(AddresTwZadZap, TwZadZap); // Odczyt z pamięci
    lcd.setCursor(13, 3);
    lcd.print(TwZadZap , 1);
    lcd.write (0);
    lcd.print("C");
    delay (1000);
  }

  }
}

void UstawFiltry ()
{
if ( (digitalRead(TwG) == LOW) && (FiltrZad < 20) && (licznik > 0 ) )
      {
        FiltrZad = FiltrZad + 1 ;
        CzasDoZap = millis ();
      }
   
      if ( (digitalRead(PMD) == LOW) && (FiltrZad > 0)&& (licznik > 0 ) )
      {
      FiltrZad = FiltrZad - 1 ;
      CzasDoZap = millis ();
      }
      if (( (digitalRead(TwD) == HIGH) && (digitalRead(PMG) == HIGH) ))
      {
      licznik = licznik + 1;
      }
     
      lcd.setCursor(0, 0);
      lcd.print("Ust. info filtra  ");
      lcd.setCursor(17, 0);
      lcd.print(FiltrZad);

      delay (500);
     
     
  if (( (digitalRead(TwD) == HIGH) && (digitalRead(PMG) == HIGH) )&& (( millis() - CzasDoZap ) >= 5000UL ))
  {
      licznik = 0;
      przycisk = 0;
  if ( FiltrZad != FiltrZadZap )
  {
    EEPROM.put(AddresFiltrZadZap, FiltrZad); //Zapis do pamięci
   
    delay (500);
 
    EEPROM.get(AddresFiltrZadZap, FiltrZadZap); // Odczyt z pamięci
 
    delay (1000);
  }
  }
}


void SterTempWew ()
{

  if (TempWew < (TwZad - 0.2) )
  {
    digitalWrite(SterTw, HIGH);
    lcd.setCursor(9, 3);
    lcd.print("#");
  }
  if (TempWew > (TwZad + 0.2) )
  {
    digitalWrite(SterTw, LOW);
    lcd.setCursor(9, 3);
    lcd.print(" ");
  }
}

void sprawdzFiltry ()
{
  if (DaneOdebrane.PmWew * FiltrZad > DaneOdebrane.PmZew  && DaneOdebrane.PmWew > 20 && FiltrZad >0)
  {
    filtry = 1;
  }
  else
  {
    filtry = 0;
  }
}

void wyswietlacz ()

{
  if (przycisk == 0 )
  {
// 1 linijka
if ( filtry == 0 ||(filtry == 1 && miganie == LOW ))
{
  lcd.setCursor(0, 0);
  lcd.print("Pa        ");
  lcd.setCursor(3, 0);
  lcd.print(CisAtm,0);
  lcd.print("hPa");
  lcd.setCursor(10, 0);
  lcd.print("REK ");
  if (DaneOdebrane.SterRek == 1)
  {
    lcd.print("START");
  }
  if (DaneOdebrane.SterRek == 0)
  {
    lcd.print("STOP ");
  }
}
if (filtry == 1 && miganie == HIGH )
  {
  lcd.setCursor(0, 0);
  lcd.print("  SPRAWDZ FILTRY  ");
  }


  lcd.setCursor(19, 0); //Ustawienie kursora
  if (miganie == LOW )
  {
    lcd.write (1);
  }
  if (miganie == HIGH )
  {
    lcd.print(" ");
  }
// 2 linijka
  lcd.setCursor(0, 1);
  lcd.print("PMz      ");
  lcd.setCursor(4, 1);
  lcd.print(DaneOdebrane.PmZew,0);
  lcd.print("%");
 
  lcd.setCursor(10, 1);
  lcd.print("PMn      ");
  lcd.setCursor(14, 1);
  lcd.print(DaneOdebrane.PmWew,0);
  lcd.print("%");


  lcd.setCursor(19, 1);
  if (DaneOdebrane.stan == 0)
  {
    lcd.print("W");
  }
  if (DaneOdebrane.stan == 2)
  {
    lcd.print("P");
  }
  if (DaneOdebrane.stan == 4)
  {
    lcd.print("S");
  }
 

 
// 3 linijka
  lcd.setCursor(0, 2);
  lcd.print("Wz        ");
  lcd.setCursor(3, 2);
  lcd.print(DaneOdebrane.WilgZew, 0);
  lcd.print("%");
  lcd.setCursor(10, 2);
  lcd.print("Tz        ");
  lcd.setCursor(13, 2);
  lcd.print(DaneOdebrane.TempZew, 1 );
  lcd.write (0);
  lcd.print("C");

 
// 4 linijka
  lcd.setCursor(0, 3);
  lcd.print("Ww      ");
  lcd.setCursor(3, 3);
  lcd.print(WilgWew, 0);
  lcd.print("%");
  lcd.setCursor(10, 3);
  lcd.print("Tw        ");
  lcd.setCursor(13, 3);
  lcd.print(TempWew, 1 );
  lcd.write (0);
  lcd.print("C");
  }
}

void odczytaj_czujniki ()
{
  if ( millis() - ZapCzasOdczytuCzuj >= 30000UL )
  {
  bme.begin();
  ZapCzasOdczytuCzuj = millis();
  TempWew = bme.readTemperature();
  WilgWew = bme.readHumidity();
  CisAtm = (bme.readPressure() / 100.0F);
  SterTempWew ();
  }
}
 
Odpowiedź
#33
Kod:
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C_Hangul.h>//biblioteka Arduino lcd IC2
LiquidCrystal_I2C_Hangul lcd(0x27, 20, 4);

int currentMenuPos = 0;// Pozycja menu?
int menuSize(3);// Wielkość menu?
byte gr = 2;// Liczba Graczy od 2 do 4
byte str = 0; //Strzałka
int menuPos = 0;
int PRZDOWN = 0;
int PRZUP = 2;

String menuLines[3] =
{
  " 2.   ",
  " 3.   ",
  " 4.   ",
};

#define PRZMENU 7
#define PRZRZUT 8
#define PRZOK 9
#define PRZUP 10
#define PRZDOWN 11

void setup() {
  pinMode(PRZUP, INPUT_PULLUP);
  pinMode(PRZDOWN, INPUT_PULLUP);
  pinMode(PRZOK, INPUT_PULLUP);
  pinMode(PRZMENU, INPUT_PULLUP); //Konfiguracja pinu 7 jako wyjście PRZMENU-
  pinMode(PRZRZUT, INPUT_PULLUP);
  lcd.init();
  lcd.begin(20, 4);  // Inicjalizacja LCD 4x20

  lcd.backlight(); // zalaczenie podswietlenia
  lcd.setCursor(2, 0);
  lcd.print("Witam Wszystkich");
  lcd.setCursor(3, 1);
  lcd.print("Kenshin Himura");
  lcd.setCursor(5, 2);
  lcd.print("Gra w 1000");
  lcd.setCursor(5, 3);
  lcd.print("28.12.2020");

}

void loop()
{

  // jeżeli przycisk down naciśnięty to przesuń strzałkę o jedną linię w dół
  // jeżeli przycisk up naciśnięty to przesuń strzałkę o jedną linię w górę
  // jeżeli przycisk ok  naciśnięty to zatwierć wybór
  // jeżeli przycisk rzut  naciśnięty to rzut kośćmi

  gr == 2; // Graczy 2
  gr == 3; // Graczy 3
  gr == 4; // Graczy 4


  if (digitalRead(PRZMENU) == HIGH) { //wyświetl menu tylko, jeśli naciśnięto przycisk
    while (digitalRead(PRZMENU) == LOW) {
      digitalWrite(PRZMENU, LOW); //
      digitalWrite(PRZMENU, HIGH);

      lcd.setCursor(1, 0);
      lcd.print("Liczba Graczy:    ");// to ma się palić  menu wyboru
      lcd.setCursor(17, 1);
      lcd.print("<-          ");    //strzałka
      lcd.setCursor(0, 1);
      lcd.print("               2.");    //to wybierane gr = 0
      lcd.setCursor(0, 2);
      lcd.print("               3.");  //to wybierane   gr + 1
      lcd.setCursor(0, 3);
      lcd.print("               4.");    //to wybierane  gr + 2
    }

    if (digitalRead(PRZDOWN) == HIGH) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
      while (digitalRead(PRZDOWN) == LOW) { //Jeśli przycisk jest wciśnięty
        digitalWrite(PRZDOWN, LOW); // Przesuń w menu wyboru ilości  graczy w dół
        digitalWrite(PRZDOWN, HIGH); // Nie przesuwaj w menu
        gr == 2;// Jeżeli zatwierdzonych graczy 2 to wyświetl Graczy 2.
        lcd.setCursor(5, 1);
        lcd.print("<-          ");    //strzałka


        if (str == 1) { // Jeżeli graczy 2
          lcd.setCursor(5, 2);
          lcd.print("<-          ");    //strzałka

          if (str == 2) { // Jeżeli graczy 2
            lcd.setCursor(5, 3);
            lcd.print("<-          ");    //strzałka

          }
          if (digitalRead(PRZUP) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
            while (digitalRead(PRZUP) == LOW) { //Jeśli przycisk jest wciśnięty
              digitalWrite(PRZUP, LOW); // Przesuń w menu wyboru ilości  graczy w górę
              digitalWrite(PRZUP, HIGH); // Nie przesuwaj w menu

            }
            if (digitalRead(PRZOK) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
              while (digitalRead(PRZOK) == LOW) { //Jeśli przycisk jest wciśnięty
                digitalWrite(PRZOK, LOW); // Zatwierdź wybór
                digitalWrite(PRZOK, HIGH);
                gr == 2;// Jeżeli zatwierdzonych graczy 2 to wyświetl Graczy 2.
                lcd.setCursor(5, 1);
                lcd.print("Graczy 2.        ");

              }
              if (digitalRead(PRZRZUT) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
                while (digitalRead(PRZRZUT) == LOW) { //Jeśli przycisk jest wciśnięty
                  digitalWrite(PRZRZUT, LOW); // Rzut kośćmi
                  digitalWrite(PRZRZUT, HIGH);


                }
              }
            }
          }
        }
      }
    }
  }
}
Nie umię zrobić aby strzałka po naciśnięciu down szła o jeden w dół a up o jeden w górę i zatwierdzić wybór OK to chcę uzyskać.
// jeżeli przycisk down naciśnięty to przesuń strzałkę o jedną linię w dół
// jeżeli przycisk up naciśnięty to przesuń strzałkę o jedną linię w górę
// jeżeli przycisk ok naciśnięty to zatwierć wybór,po ztwierdzeniu wyświetl liczbę graczy ,np. Graczy 2. i niżej Przejdz Do Gry. Ok i przechodzi do Gry w 1000.
// jeżeli przycisk rzut naciśnięty to rzut kośćmi przez Gracza 1
// jeżeli przycisk rzut naciśnięty ponownie to rzut kośćmi przez Gracza 2
// jeżeli przycisk rzut naciśnięty 3 raz to rzut kośćmi przez Gracza 1 itd
 
Odpowiedź
#34
Ty nadal swoje nic nie zrozumiałeś......

Czemu nie dzielisz kodu?? czy mając książkę kucharska i pieczesz ciasto to robisz wszystkie przepisy i ciasta aż dojdziesz do docelowego czy jednak przewracasz strony do docelowego przepisu??

Dziel kod oddziel przyciski od wyświetlacza, i od programu wykonawczego...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#35
ja piszę pierwszy raz menu i nie wiem jak napisać. Jak ktoś gotuje nowe danie też pierwszy raz to patrzy do przepisu. ja nigdzie nie znalazłem przepisu na proste menu na 5 przyciskach na wyjściach cyfrowych. A przynajmniej aby było na trzech prziciskach. Jak gotuję drugi raz jakieś danie to wprowadzam zmiany według siebie.
 
Odpowiedź
#36
Czy kolega próbował wpisać w Google "Arduino menu"? Bo widziałem dużo przykładów, kiedyś sprawdzałem takie proste menu tu: https://starter-kit.nettigo.pl/2017/04/m...aczu-16x2/ i działa.
Na naszym forum jest tutorial do menu tutaj: https://forum.arduinopolska.pl/watek-san...2asne-menu , ale raczej bardziej skomplikowane. Na Youtube jest parę tysięcy tutoriali o tym, oczywiście nie po polsku, ale kod i tak jest w jednym języku.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#37
Próbowałem i wyszukiwało mi ale same wielopozycyjne a ja chce na 3 max 4 pozycje. W dodatku na analogi były . Przesdudioję ten 2 przykład ale za dużo tam napisane.. W dodatku nie LCD.
 
Odpowiedź
#38
Kurcze, nie wytrzymałem.
Kod:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); // ustawienie wyświetlacza adres 0x3F


byte przyciskPrawo = 0;
byte przyciskLewo = 0;
byte przyciskOK = 0;
byte ekran = 0;
byte iloscGraczy = 0;
byte stanOK = 0;
byte stanLewo = 0;
byte stanPrawo = 0;

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.clear(); // zerowanie wyświetlacza
  pinMode(2, INPUT_PULLUP); // przycisk prawo
  pinMode(3, INPUT_PULLUP);// przycisk OK
  pinMode(4, INPUT_PULLUP); //przycisk lewo

}

void loop()
{
  przyciski();
  if (ekran == 0)
  {
    powitanie();
  }
  if (ekran == 1)
  {
    wyborIlosciGraczy();
  }
if (ekran == 2)
{
  ilosciGraczy();
}
}

void powitanie()
{

  lcd.setCursor(0, 0);
  lcd.print("  Witam Wszystkich   ");
  lcd.setCursor(0, 1);
  lcd.print("     Gra w 1000");
  lcd.setCursor(0, 2);
  lcd.print("   Kenshin Himura");
  lcd.setCursor(0, 3 );
  lcd.print("    nacisnij OK");
  if (przyciskOK == 1 && stanOK == 0)
  {
    stanOK = 1;
  }
  if (przyciskOK == 0 && stanOK == 1)
  {
    stanOK = 0;
    ekran = 1;
  }

}
void przyciski()
{
  if (digitalRead (2) == LOW)
  {
    delay (20);
    if (digitalRead (2) == LOW)
    {
      przyciskPrawo = 1;
    }
  }
  else
  {
    przyciskPrawo = 0;
  }
  if (digitalRead (3) == LOW)
  {
    delay (20);
    if (digitalRead (3) == LOW)
    {
      przyciskOK = 1;
    }
  }
  else
  {
    przyciskOK = 0;
  }
  if (digitalRead (4) == LOW)
  {
    delay (20);
    if (digitalRead (4) == LOW)
    {
      przyciskLewo = 1;
    }
  }
  else
  {
    przyciskLewo = 0;
  }
}

void wyborIlosciGraczy()
{

  lcd.setCursor(0, 0);
  lcd.print("Wybor ilosci graczy");
  lcd.setCursor(0, 1);
  lcd.print("Ilosc graczy      ");
  lcd.setCursor(14, 1);
  lcd.print(iloscGraczy);
  lcd.setCursor(0, 2);
  lcd.print("naciskaj prawo lewo");
  lcd.setCursor(0, 3 );
  lcd.print("zatwierdz OK     ");

  if (przyciskPrawo == 1 && stanPrawo == 0 && iloscGraczy < 5)
  {
    stanPrawo = 1;
  }
  if (przyciskPrawo == 0 && stanPrawo == 1)
  {
    stanPrawo = 0;
    iloscGraczy = iloscGraczy + 1;
  }
   if (przyciskLewo == 1 && stanLewo == 0 && iloscGraczy > 2)
  {
    stanLewo = 1;
  }
  if (przyciskLewo == 0 && stanLewo == 1)
  {
    stanLewo = 0;
    iloscGraczy = iloscGraczy - 1;
  }
  if (przyciskOK == 1 && stanOK == 0)
  {
    stanOK = 1;
  }
  if (przyciskOK == 0 && stanOK == 1)
  {
    stanOK = 0;
    ekran = 2;
  }
}
void ilosciGraczy()
{

  lcd.setCursor(0, 0);
  lcd.print("Wyborano    graczy  ");
  lcd.setCursor(9, 0);
  lcd.print(iloscGraczy);
  lcd.setCursor(0, 1);
  lcd.print("Rozpocznij gre      ");
  lcd.setCursor(0, 2);
  lcd.print("Nacisnij OK         ");
  lcd.setCursor(0, 3 );
  lcd.print("Powodzenia          ");

if (przyciskOK == 1 && stanOK == 0)
  {
    stanOK = 1;
  }
  if (przyciskOK == 0 && stanOK == 1)
  {
    stanOK = 0;
    ekran = 0;
  }
}
 
Odpowiedź
#39
(01-01-2021, 19:49)Agregacik napisał(a): Kurcze, nie wytrzymałem.
Kod:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); // ustawienie wyświetlacza adres 0x3F


byte przyciskPrawo = 0;
byte przyciskLewo = 0;
byte przyciskOK = 0;
byte ekran = 0;
byte iloscGraczy = 0;
byte stanOK = 0;
byte stanLewo = 0;
byte stanPrawo = 0;

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.clear(); // zerowanie wyświetlacza
  pinMode(2, INPUT_PULLUP); // przycisk prawo
  pinMode(3, INPUT_PULLUP);// przycisk OK
  pinMode(4, INPUT_PULLUP); //przycisk lewo

}

void loop()
{
  przyciski();
  if (ekran == 0)
  {
    powitanie();
  }
  if (ekran == 1)
  {
    wyborIlosciGraczy();
  }
if (ekran == 2)
{
  ilosciGraczy();
}
}

void powitanie()
{

  lcd.setCursor(0, 0);
  lcd.print("  Witam Wszystkich   ");
  lcd.setCursor(0, 1);
  lcd.print("     Gra w 1000");
  lcd.setCursor(0, 2);
  lcd.print("   Kenshin Himura");
  lcd.setCursor(0, 3 );
  lcd.print("    nacisnij OK");
  if (przyciskOK == 1 && stanOK == 0)
  {
    stanOK = 1;
  }
  if (przyciskOK == 0 && stanOK == 1)
  {
    stanOK = 0;
    ekran = 1;
  }

}
void przyciski()
{
  if (digitalRead (2) == LOW)
  {
    delay (20);
    if (digitalRead (2) == LOW)
    {
      przyciskPrawo = 1;
    }
  }
  else
  {
    przyciskPrawo = 0;
  }
  if (digitalRead (3) == LOW)
  {
    delay (20);
    if (digitalRead (3) == LOW)
    {
      przyciskOK = 1;
    }
  }
  else
  {
    przyciskOK = 0;
  }
  if (digitalRead (4) == LOW)
  {
    delay (20);
    if (digitalRead (4) == LOW)
    {
      przyciskLewo = 1;
    }
  }
  else
  {
    przyciskLewo = 0;
  }
}

void wyborIlosciGraczy()
{

  lcd.setCursor(0, 0);
  lcd.print("Wybor ilosci graczy");
  lcd.setCursor(0, 1);
  lcd.print("Ilosc graczy      ");
  lcd.setCursor(14, 1);
  lcd.print(iloscGraczy);
  lcd.setCursor(0, 2);
  lcd.print("naciskaj prawo lewo");
  lcd.setCursor(0, 3 );
  lcd.print("zatwierdz OK     ");

  if (przyciskPrawo == 1 && stanPrawo == 0 && iloscGraczy < 5)
  {
    stanPrawo = 1;
  }
  if (przyciskPrawo == 0 && stanPrawo == 1)
  {
    stanPrawo = 0;
    iloscGraczy = iloscGraczy + 1;
  }
   if (przyciskLewo == 1 && stanLewo == 0 && iloscGraczy > 2)
  {
    stanLewo = 1;
  }
  if (przyciskLewo == 0 && stanLewo == 1)
  {
    stanLewo = 0;
    iloscGraczy = iloscGraczy - 1;
  }
  if (przyciskOK == 1 && stanOK == 0)
  {
    stanOK = 1;
  }
  if (przyciskOK == 0 && stanOK == 1)
  {
    stanOK = 0;
    ekran = 2;
  }
}
void ilosciGraczy()
{

  lcd.setCursor(0, 0);
  lcd.print("Wyborano    graczy  ");
  lcd.setCursor(9, 0);
  lcd.print(iloscGraczy);
  lcd.setCursor(0, 1);
  lcd.print("Rozpocznij gre      ");
  lcd.setCursor(0, 2);
  lcd.print("Nacisnij OK         ");
  lcd.setCursor(0, 3 );
  lcd.print("Powodzenia          ");

if (przyciskOK == 1 && stanOK == 0)
  {
    stanOK = 1;
  }
  if (przyciskOK == 0 && stanOK == 1)
  {
    stanOK = 0;
    ekran = 0;
  }
}
Mam pytanie czy inne wejścia mogą być? Np. 6, 7,8, i czy muszą byćr ezystory przy przyciskach.? Bo ja mam rezystory 10 K. Zmieniłem biblioteki na lcd i wyświetla ale nic nie reaguje na przyciski. Dodałem polskie znaki, na 2,3,4 działa.
 
Odpowiedź
#40
Powinno działać na 6,7,8. Czy wszędzie zmieniałeś numery pinów w "void przyciski()" też? Rezystorów nie musi być ale nie zaszkodzą. Rezystory oczywiście podciągające do +5V.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości