• 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
Kilka "stron" LCD
#11
testowałem i widzę ze to dział i nie miga masz to i po pacz I ewentualni filmik nagraj u mnie jest ok
Kod:
#include <LiquidCrystal.h>
const int s1 = 48;
LiquidCrystal lcd(40, 41, 42, 43, 44, 45);

int s1stan;
int a=0;
int b=0;
int NodeTempC[1];
int NodeCounter[1];

void setup() {

  lcd.begin(20, 4);

  pinMode(s1, INPUT);
    pinMode(s1, OUTPUT);
  
digitalWrite(s1, HIGH);  
  lcd.clear();  
NodeCounter[1]=1;
NodeTempC[1]=1;
a=1;
b=0;
}

void loop() {
  if (digitalRead(s1) == LOW)
{
  if(a == 0){
    a=1;
    b=0;
    czysc();
  }
  lcd.setCursor(0, 0);
  lcd.print("N:1 -");
  lcd.print("P:");
  lcd.print(NodeCounter[01]);
  lcd.setCursor(0, 1);
  lcd.print("N:2 -");
  lcd.print("P:");
  lcd.print(NodeCounter[02]);
  lcd.setCursor(0, 2);
  lcd.print("N:3 -");
  lcd.print("P:");
  lcd.print(NodeCounter[01]);
  lcd.setCursor(0, 3);
  lcd.print("N:4 -");
  lcd.print("P:");
  lcd.print(NodeCounter[04]);
}
else
{
    if(b == 0){
    a=0;
    b=1;
    czysc();
  }
  lcd.setCursor(0, 0);
  lcd.print("Temp1:");
  lcd.print(NodeTempC[06], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 1);
  lcd.print("Temp2:");
  lcd.print(NodeTempC[02], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 2);
  lcd.print("Temp3:");
  lcd.print(NodeTempC[04], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 3);
  lcd.print("Temp4:");
  lcd.print(NodeTempC[04], 1);
  lcd.write((uint8_t)0);
}

}

void czysc(){
if(b == 1)a=0;
if(a == 1)b=0;
lcd.clear();
return;

}
 
Odpowiedź
#12
Ok Sprawdzę w domu jak wrócę z pracy być może gdzieś popełniłem błąd, 
jeśli problem będzie występował dalej nagram filmik.

Powiedz mi jeszcze dlaczego masz w

Kod:
void setup

NodeCounter[1]=1;
NodeTempC[1]=1;



poza tym czy 

Kod:
a=1;
b=0;



ma być w setupie ? będzie jakaś różnica jak będzie ponad setupem tam gdzie się zawiera #include itd. ??
 
Odpowiedź
#13
Kod:
void setup

NodeCounter[1]=1;
NodeTempC[1]=1;
bo kompilator wywalał mi brak tych zmiennych a dlaczego 1 wsunie wpisywałem rożne wartości i wyświetlałem na LCD
Kod:
a=1;
b=0;
to stany początkowe gdyby było 0 0 to najpierw wskoczy do poziomu 2 a potem do poziomu 1 a tak wskakuje odrazu do poziomu 1 to bity warunków if właściwie możesz zmienić int na bool bo i tak więcej jak 0,1 nie ma
 
Odpowiedź
#14
Tak sobie teraz siedzę i patrzę na ten mój twór z dopisanym kawałkiem kodu od Ciebie do obsługi przełącznika i powiem Ci że mruganie ustało ALE jest tego przyczyna, mianowicie mój program obsługuje nie tylko czujniki temperatury ale też komunikację radiową na modułach NRF24L01 i przyczyną ustania mrugania jest to że od kilku dni mam odłączoną właśnie tą komunikację.

Sytuacja ma się następująco chcę przedstawić mój projekt na forum ale na tę chwilę nie wydaje mi się aby kod był do końca dopracowany dlatego nie chciał bym go jeszcze umieszczać na razie zamieszczę strukturę main loop:

Kod:
void loop(void)
{
    network.update();
    sensors.requestTemperatures();
    while ( network.available() )
    {
        getRadioData();
    }
            if (digitalRead(buttonPin) == HIGH)
    {
     if(a == 0){
       a=1;
       b=0;
       czysc();
     }
    displayDataLCD2();
    }
    else
    {
       if(b == 0){
       a=0;
       b=1;
       czysc();
     }
     displayDataLCD();
    }
    Alarm();
    delay(100);
}

i teraz tak 

mam nadajnik podpięty do pieca CO który właśnie drogą radiową przekazuje mi temperaturę z pieca oraz numer wysłanego pakietu, nadawanie odbywa się co 5s - właśnie wtedy następuje mignięcie.
W tym momencie mam wyłączony ten nadajnik i w/w program nie odbiera nic ale dalej wykonuje czynności takie jak odczyt czujników bezpośrednio podpiętych do stacji odbiorczej, wyświetla wszystko na LCD oraz oczywiście obsługuje przycisk do którego kolega Adix pomógł mi dopisać program.

Pytanie, dlaczego gdy odbierane są pakiety drogą radiową następuje migotanie LCD zupełnie jak gdyby wykonywała się komenda lcd.clear() ???
 
Odpowiedź
#15
Pobaw się takim kodem , używam wraz z radiówką i nic nie miga. Dopóki na nie zmienisz strony nie będzie kasowany więc nie będzie migotania jedynie musisz pamiętać aby dane się pokrywały i staraj się tak dane wpisywać aby nie wychodziły poza obszar wyświetlacza to czasem też powoduje migotanie . Możesz stworzyć 200 stron czy 1000 i dokładnie kierować dane do odpowiedniej strony , kod jest jak myślę prosty i bardzo przejrzysty .

Kod:
#include <ShiftRegLCD123.h>
ShiftRegLCD123 srlcd( 7, 6, SRLCD123);
char strona = 1;
char lcd = 1;

void setup() {

Serial.begin(115200);          
srlcd.begin(16,2);              
pinMode(10, INPUT_PULLUP);          
 

}

void loop() {
 
 if ( digitalRead(10) == LOW )strona++;delay(250);
 if ( strona > 5 )strona = 1;
 LCD();
}
 
 void LCD(){
 
  switch (strona) {
 
  case 1:      
   
  if (lcd != 1){srlcd.clear();lcd = 1;} //czyszczenie ekranu 1

     srlcd.setCursor(0,0);      
     srlcd.print("lcd 1 ");
     srlcd.setCursor(0,1);
     srlcd.print("lcd 1 ");
     break;

  case 2:      
   
   if (lcd != 2){srlcd.clear();lcd = 2;} //czyszczenie ekranu 2
   
     srlcd.setCursor(2,0);      
     srlcd.print("lcd 2 ");
     srlcd.setCursor(2,1);
     srlcd.print("lcd 2 ");
     break;
   
  case 3:    
   
     if (lcd != 3){srlcd.clear();lcd = 3;} //czyszczenie ekranu 3

     srlcd.setCursor(4,0);      
     srlcd.print("lcd 3 ");
     srlcd.setCursor(4,1);
     srlcd.print("lcd 3 ");
     break;
 
  case 4:      
 
     if (lcd != 4){srlcd.clear();lcd = 4;} //czyszczenie ekranu 4
       
     srlcd.setCursor(6,0);      
     srlcd.print("lcd 4 ");
     srlcd.setCursor(6,1);
     srlcd.print("lcd 4 ");
     break;

  case 5:      

   if (lcd != 5){srlcd.clear();lcd = 5;} //czyszczenie ekranu 5

     srlcd.setCursor(8,0);      
     srlcd.print("lcd 5 ");
     srlcd.setCursor(8,1);
     srlcd.print("lcd 5 ");
     break;
  }  
}

I jeszcze kodzik jak użyć wywołania strony niezależnej " alarmu " oczywiście nie musi być wywołana przyciskiem tylko może być funkcją.

Kod:
#include <ShiftRegLCD123.h>
ShiftRegLCD123 srlcd( 7, 6, SRLCD123);

char strona = 1;
char lcd = 1;

void setup() {

Serial.begin(115200);          
srlcd.begin(16,2);              
pinMode(10, INPUT_PULLUP);          
pinMode(11, INPUT_PULLUP);

}

void loop() {
 
 
 if ( digitalRead(11) == LOW )strona = 100;delay(250);
 if ( digitalRead(10) == LOW )strona++;delay(250);
 if ( strona > 5 and strona != 100 )strona = 1;
 LCD();
}
 
 void LCD(){
 
  switch (strona) {
 
  case 1:      
   
  if (lcd != 1){srlcd.clear();lcd = 1;} //czyszczenie ekranu 1

     srlcd.setCursor(0,0);      
     srlcd.print("lcd 1 ");
     srlcd.setCursor(0,1);
     srlcd.print("lcd 1 ");
     break;

  case 2:      
   
   if (lcd != 2){srlcd.clear();lcd = 2;} //czyszczenie ekranu 2
   
     srlcd.setCursor(2,0);      
     srlcd.print("lcd 2 ");
     srlcd.setCursor(2,1);
     srlcd.print("lcd 2 ");
     break;
   
  case 3:    
   
     if (lcd != 3){srlcd.clear();lcd = 3;} //czyszczenie ekranu 3

     srlcd.setCursor(4,0);      
     srlcd.print("lcd 3 ");
     srlcd.setCursor(4,1);
     srlcd.print("lcd 3 ");
     break;
 
  case 4:      
 
     if (lcd != 4){srlcd.clear();lcd = 4;} //czyszczenie ekranu 4
       
     srlcd.setCursor(6,0);      
     srlcd.print("lcd 4 ");
     srlcd.setCursor(6,1);
     srlcd.print("lcd 4 ");
     break;

  case 5:      

   if (lcd != 5){srlcd.clear();lcd = 5;} //czyszczenie ekranu 5

     srlcd.setCursor(8,0);      
     srlcd.print("lcd 5 ");
     srlcd.setCursor(8,1);
     srlcd.print("lcd 5 ");
     break;
     
   case 100:      

   if (lcd != 100){srlcd.clear();lcd = 100;} //czyszczenie ekranu 100

   for ( int x = 0; x < 10; x++ ){

     srlcd.setCursor(2,0);      
     srlcd.print("alarm 100 ");
     srlcd.setCursor(2,1);
     srlcd.print("alarm 100 ");
     delay(250);
     srlcd.setCursor(2,0);      
     srlcd.print("          ");
     srlcd.setCursor(2,1);
     srlcd.print("          ");
     delay(250);
   }
     strona = 1;
     break;  
  }  
}

I na koniec jak zrobić żeby po alarmie wracało do poprzednio wywołanej strony .

Kod:
#include <ShiftRegLCD123.h>
ShiftRegLCD123 srlcd( 7, 6, SRLCD123);

char strona = 1;
char trzymaj = 1;
char lcd = 1;

void setup() {

Serial.begin(115200);          
srlcd.begin(16,2);              
pinMode(10, INPUT_PULLUP);          
pinMode(11, INPUT_PULLUP);

}

void loop() {
  
  
  if ( digitalRead(11) == LOW ){trzymaj = strona;strona = 100;delay(250);}
  if ( digitalRead(10) == LOW ){strona++;delay(250);}
  if ( strona > 5 and strona != 100 )strona = 1;
  LCD();
}
  
  void LCD(){
  
   switch (strona) {
  
   case 1:      
    
   if (lcd != 1){srlcd.clear();lcd = 1;} //czyszczenie ekranu 1

      srlcd.setCursor(0,0);      
      srlcd.print("lcd 1 ");
      srlcd.setCursor(0,1);
      srlcd.print("lcd 1 ");
      break;

   case 2:      
    
    if (lcd != 2){srlcd.clear();lcd = 2;} //czyszczenie ekranu 2
    
      srlcd.setCursor(2,0);      
      srlcd.print("lcd 2 ");
      srlcd.setCursor(2,1);
      srlcd.print("lcd 2 ");
      break;
    
   case 3:    
    
      if (lcd != 3){srlcd.clear();lcd = 3;} //czyszczenie ekranu 3

      srlcd.setCursor(4,0);      
      srlcd.print("lcd 3 ");
      srlcd.setCursor(4,1);
      srlcd.print("lcd 3 ");
      break;
  
   case 4:      
  
      if (lcd != 4){srlcd.clear();lcd = 4;} //czyszczenie ekranu 4
        
      srlcd.setCursor(6,0);      
      srlcd.print("lcd 4 ");
      srlcd.setCursor(6,1);
      srlcd.print("lcd 4 ");
      break;

   case 5:      

    if (lcd != 5){srlcd.clear();lcd = 5;} //czyszczenie ekranu 5

      srlcd.setCursor(8,0);      
      srlcd.print("lcd 5 ");
      srlcd.setCursor(8,1);
      srlcd.print("lcd 5 ");
      break;
      
    case 100:      

    if (lcd != 100){srlcd.clear();lcd = 100;} //czyszczenie ekranu 100

    for ( int x = 0; x < 10; x++ ){

      srlcd.setCursor(2,0);      
      srlcd.print("alarm 100 ");
      srlcd.setCursor(2,1);
      srlcd.print("alarm 100 ");
      delay(250);
      srlcd.setCursor(2,0);      
      srlcd.print("          ");
      srlcd.setCursor(2,1);
      srlcd.print("          ");
      delay(250);
    }
      strona = trzymaj;
      break;  
   }  
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#16
Bardzo Dziękuję za odpowiedź, jak tylko będę miał chwilę czasu od razu biorę się do programowania, mam jednak kilka pytań:

Kod:
#include <ShiftRegLCD123.h>
ShiftRegLCD123 srlcd( 7, 6, SRLCD123);

char strona = 1;
char lcd = 1;

1) Nie będzie problemu jeśli w swoim projekcie używam innych bibliotek tzn. obsługuję LCD poprzez I2C za pomocą PCF8574 ?

2) Czy dużym problemem będzie sytuacja gdy dane w tej samej linii i kolumnie w ekranie 1 i 2 będą się różniły długością? tzn.:

LCD1 Linia 0 Kol. 0

T1: xx.x *C

LCD2 Linia 0 kol. 0

N:1 P: xxxxxxxxxx

3) Dużym problemem była by implementacja do Twojego programu impulsatora ( rotary encoder ) bo niedawno kupiłem sobie owe cudo ale jak na razie leży i czeka na swoją kolej. Dlaczego pytam czy łatwo, nie miałem z nimi jeszcze styczności jeśli chodzi o programowanie i nie za bardzo wiem jak się do tego zabrać a z tego co widzę idealnie by się do tej roli nadał Smile
 
Odpowiedź
#17
Tak biblioteki dowolne ShiftRegLCD i lcd są identyczne jedynie moje są przesyłane poprzez scalak zamieniający protokół z szeregowego na równoległy a funkcje są identyczne .

Nie ponieważ wywołując inną stronę niż była jest ona czyszczona . Długość danych musi być zachowana tylko na tej samej stronie jeżeli nie była zmieniana jak zmienisz stronę poprzednia się czyści po powrocie na nią .

Żadnego problemu nie widzę jak znajdę encoder to ci dopiszę daj mi z godzinkę .
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#18
(26-09-2015, 14:03)JasQ napisał(a): Nie ponieważ wywołując inną stronę niż była jest ona czyszczona . Długość danych musi być zachowana tylko na tej samej stronie jeżeli nie była zmieniana jak zmienisz stronę poprzednia się czyści po powrocie na nią .


Wybacz że od razu nie zrozumiałem, w każdym razie miałem już z tym problemem styczność przy obsłudze czujnika ciśnienia BMP180, a mianowicie gdy ciśnienie spadało poniżej 1000.0 hPa to zero po przecinku zostawało i miałem sytuację np 999.90 gdzie mój program zakłada tylko jedno miejsce po przecinku, niby nie gra roli ale denerwuje.

poradziłem sobie z tym tak:

Kod:
    if (bmp.readPressure() / 100.0 < 1000)                                
        {
    lcd.setCursor(12, 0);
    lcd.print("P:");
    lcd.print(bmp.readPressure() / 100.0, 1);
    lcd.setCursor(19, 0);
    lcd.print(" ");
    }
    else
    {
    lcd.setCursor(12, 0);
    lcd.print("P:");
    lcd.print(bmp.readPressure() / 100.0, 1);             
        }

Wyczyściłem ostatnią komórkę wiersza gdy ciśnienie spada <1000.0 hPa 

W razie pytań dzielenie przez 100 pozwala uzyskać właśnie wartość hPa (hekto pascali), gdyż czujnik domyślnie wyświetla wartość w Pascalach Smile
 
Odpowiedź
#19
Tu masz pod encoder taki prosty 24 pozycje środkowy pin enkodera do masy . Nie użyłem przykładów z sieci bo jak nie masz enkodera na pinach przerwania to potrafi skakać 2 do przodu 3 do tyłu co mnie osobiście doprowadzało do szału .

Kod:
#include <ShiftRegLCD123.h>
ShiftRegLCD123 srlcd( 7, 6, SRLCD123);

#define EncoderA 3
#define EncoderB 4
#define EncoderC 5
    
     int enc = 0;
        
char strona = 1;
char trzymaj = 1;
char lcd = 1;

void setup() {

Serial.begin(9600);          
srlcd.begin(16,2);              
pinMode(10, INPUT_PULLUP);          
pinMode(11, INPUT_PULLUP);
pinMode(EncoderA, INPUT_PULLUP);          
pinMode(EncoderB, INPUT_PULLUP);
pinMode(EncoderC, INPUT_PULLUP);

}

void loop() {
  
  
  if ( digitalRead(11) == LOW ){trzymaj = strona;strona = 100;delay(250);}
  if ( digitalRead(10) == LOW ){strona++;delay(250);}
  if ( strona > 5 and strona != 100 )strona = 1;
  if ( strona < 1 and strona != 100 )strona = 5;
  strona = enc + strona ;
  LCD();
  Encoder();
  Serial.print(digitalRead(EncoderA));
  Serial.print(" : ");
  Serial.print(digitalRead(EncoderB));
  Serial.print(" : ");
  Serial.println(enc);
  
  
  
  
}
  
  void LCD(){
  
   switch (strona) {
  
   case 1:      
    
   if (lcd != 1){srlcd.clear();lcd = 1;} //czyszczenie ekranu 1

      srlcd.setCursor(0,0);      
      srlcd.print("lcd 1 ");
      srlcd.setCursor(0,1);
      srlcd.print("lcd 1 ");
      break;

   case 2:      
    
    if (lcd != 2){srlcd.clear();lcd = 2;} //czyszczenie ekranu 2
    
      srlcd.setCursor(2,0);      
      srlcd.print("lcd 2 ");
      srlcd.setCursor(2,1);
      srlcd.print("lcd 2 ");
      break;
    
   case 3:    
    
      if (lcd != 3){srlcd.clear();lcd = 3;} //czyszczenie ekranu 3

      srlcd.setCursor(4,0);      
      srlcd.print("lcd 3 ");
      srlcd.setCursor(4,1);
      srlcd.print("lcd 3 ");
      break;
  
   case 4:      
  
      if (lcd != 4){srlcd.clear();lcd = 4;} //czyszczenie ekranu 4
        
      srlcd.setCursor(6,0);      
      srlcd.print("lcd 4 ");
      srlcd.setCursor(6,1);
      srlcd.print("lcd 4 ");
      break;

   case 5:      

    if (lcd != 5){srlcd.clear();lcd = 5;} //czyszczenie ekranu 5

      srlcd.setCursor(8,0);      
      srlcd.print("lcd 5 ");
      srlcd.setCursor(8,1);
      srlcd.print("lcd 5 ");
      break;
      
    case 100:      

    if (lcd != 100){srlcd.clear();lcd = 100;} //czyszczenie ekranu 100

    for ( int x = 0; x < 10; x++ ){

      srlcd.setCursor(2,0);      
      srlcd.print("alarm 100 ");
      srlcd.setCursor(2,1);
      srlcd.print("alarm 100 ");
      delay(250);
      srlcd.setCursor(2,0);      
      srlcd.print("          ");
      srlcd.setCursor(2,1);
      srlcd.print("          ");
      delay(250);
    }
      strona = trzymaj;
      break;  
   }  
}


void Encoder( void ){
  
  enc = 0;

     while ( digitalRead(EncoderA) == LOW ){
     if ( digitalRead(EncoderB) == LOW ){
     enc = 1;}}
    
     while ( digitalRead(EncoderB) == LOW ){
     if ( digitalRead(EncoderA) == LOW ){
     enc = -1;}}

  }
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#20
Jeśli chodzi o to skakanie enkodera, próbowałeś debouncować go przez dodanie dwóch kondensatorów 0,1uF między pinem 1 a GND ( pin 2 ) oraz Pin 3 a GND ( znów pin 2 ).

Gdzieś widziałem że można dodać jeszcze cztery rezystory 10k w załącznikach przesyłam 2 schematy Smile


Załączone pliki Miniatury
       
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości