• 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 z menu
#1
Witam 
Podczas pisania prostego menu do sterowania oświetleniem napotkałem na problem. Ogólnie w programie chodzi o to żeby za pomocą enkodera poruszać się po menu dzięki któremu będzie można sterować przekaźnikami które z kolei będą sterować oświetleniem. Mój problem polega na tym iż np. przy włączeniu sekcji 1 i przy próbie włączenia 2 sekcji sekcja 1 z powrotem się wyłącza a włącza się 2 i tyczy się to wszystkich sekcji. Sam kod może trochę pomieszany ale jestem jeszcze przed porządkowaniem go.

Użyte elementy:
arduino uno 
płytka przekaźnikowa 8 modułowa 
enkoder
wyświetlacz lcd 4/20 i2c
Kod:
#include <OneButton.h>
#include <Encoder.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
//wyswietlacz
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//wyjscia
int L1 = 5;
int L2 = 6;
int L3 = 7;
int L4 = 8;
int L5 = 9;
int L6 = 10;
int L7 = 11;
int L8 = 12;
int SL1 = LOW;
int SL2 = LOW;
int SL3 = LOW;
int SL4 = LOW;
int SL5 = LOW;
int SL6 = LOW;
int SL7 = LOW;
int SL8 = LOW;

long oldPosition = -999;
int poz = 0;
int Sm = 0;
int SSm = 0;
int menu = 0;
int R = 100;
int G = 100;
int B = 100;
int J = 100;
//enkoder
Encoder myEnc(2, 3);
//przycisk
int buttonPin = 13;
OneButton button(buttonPin, true);
uint8_t arrow[8] = {0x0, 0x04 ,0x06, 0x1f, 0x06, 0x04, 0x00, 0x00};


void setup() {
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
 
button.attachClick(singleClick);
button.attachDoubleClick(doubleClick);
button.attachDuringLongPress(longPress);
lcd.clear();
lcd.begin(20,4);
lcd.createChar(1, arrow);
lcd.home();
lcd.print("oswietlenie 0.1");
delay(2000);
lcd.clear();
lcd.home();
lcd.write(1);
lcd.print("Sterowanie");
lcd.setCursor(0,1);
lcd.print(" Taras all");
lcd.setCursor(0,2);
lcd.print(" Funkcje");
lcd.setCursor(0,3);
lcd.print(" Wylaczenie");
   Serial.begin(9600);
  Serial.println("Basic Encoder Test:");
 

}

void loop() {

digitalWrite(L1, SL1);
digitalWrite(L2, SL2);
digitalWrite(L3, SL3);
digitalWrite(L4, SL4);
digitalWrite(L5, SL5);
digitalWrite(L6, SL6);
digitalWrite(L7, SL7);
digitalWrite(L8, SL8);






 
/*  if(l1 == 0){
  digitalWrite(4, LOW);}
  else{  digitalWrite(4, HIGH);}
  if(l2 == 0){
  digitalWrite(5, LOW);}
  else{  digitalWrite(5, HIGH);}
  if(l3 == 0){
  digitalWrite(6, LOW);}
  else{  digitalWrite(6, HIGH);}
    if(l4 == 0){
  digitalWrite(7, LOW);}
  else{  digitalWrite(7, HIGH);}
    if(l5 == 0){
  digitalWrite(8, LOW);}
  else{  digitalWrite(8, HIGH);}
    if(l6 == 0){
  digitalWrite(9, LOW);}
  else{  digitalWrite(9, HIGH);}
    if(l7 == 0){
  digitalWrite(10, LOW);}
  else{  digitalWrite(10, HIGH);}
    if(l8 == 0){
  digitalWrite(11, LOW);}
  else{  digitalWrite(11, HIGH);}
  */
button.tick();
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
  //  Serial.println(newPosition);
   Serial.println(poz) ;   

 

if(Sm == 0 )
     {
if(0 <= newPosition && newPosition < 4)
      {
lcd.clear();
lcd.home();
lcd.write(1);
lcd.print("Sterowanie");
lcd.setCursor(0,1);
lcd.print(" Taras all");
lcd.setCursor(0,2);
lcd.print(" Funkcje");
lcd.setCursor(0,3);
lcd.print(" Wylaczenie");
       poz = 1;
//      Serial.println(poz);
      }
if(4 <= newPosition && newPosition < 9)
      {
lcd.clear();
lcd.home();
lcd.print(" Sterowanie");
lcd.setCursor(0,1);
lcd.write(1);
lcd.print("Taras all");
lcd.setCursor(0,2);
lcd.print(" Funkcje");
lcd.setCursor(0,3);
lcd.print(" Wylaczenie");
       poz = 2;
//      Serial.println(poz);
      }
if(9 <= newPosition && newPosition < 13)
      {
lcd.clear();
lcd.home();
lcd.print(" Sterowanie");
lcd.setCursor(0,1);
lcd.print(" Taras all");
lcd.setCursor(0,2);
lcd.write(1);
lcd.print("Funkcje");
lcd.setCursor(0,3);
lcd.print(" Wylaczenie");
       poz = 3;
//     Serial.println(poz);
      }
if(13 <= newPosition && newPosition < 16)
      {
lcd.clear();
lcd.home();
lcd.print(" Sterowanie");
lcd.setCursor(0,1);
lcd.print(" Taras all");
lcd.setCursor(0,2);
lcd.print(" Funkcje");
lcd.setCursor(0,3);
lcd.write(1);
lcd.print("Wylaczenie");
       poz = 4;
//      Serial.println(poz);
      }
if(newPosition > 16)
      {myEnc.write(16);} 
if(newPosition < 0)
      {myEnc.write(0);}
  }
if(Sm == 1 ){
if(0 <= newPosition && newPosition < 4){
       lcd.clear();
       lcd.home();
       lcd.write(1);
       lcd.print("sekcja 1");
       lcd.setCursor(0,1);
       lcd.print(" sekcja 2");
       lcd.setCursor(0,2);
       lcd.print(" sekcja 3");
       lcd.setCursor(0,3);
       lcd.print(" sekcja 4");
       poz = 1;
       
}
if(4 <= newPosition && newPosition < 8){
       lcd.clear();
       lcd.home();
       lcd.print(" sekcja 1");
       lcd.setCursor(0,1);
       lcd.write(1);
       lcd.print("sekcja 2");
       lcd.setCursor(0,2);
       lcd.print(" sekcja 3");
       lcd.setCursor(0,3);
       lcd.print(" sekcja 4");
       poz = 2;
}
if(8 <= newPosition && newPosition < 12){
       lcd.clear();
       lcd.home();
       lcd.print(" sekcja 1");
       lcd.setCursor(0,1);
       lcd.print(" sekcja 2");
       lcd.setCursor(0,2);
       lcd.write(1);
       lcd.print("sekcja 3");
       lcd.setCursor(0,3);
       lcd.print(" sekcja 4");
       poz = 3;
}
if(12 <= newPosition && newPosition < 16){
       lcd.clear();
       lcd.home();
       lcd.print(" sekcja 2");
       lcd.setCursor(0,1);
       lcd.print(" sekcja 3");
       lcd.setCursor(0,2);
       lcd.write(1);
       lcd.print("sekcja 4");
       lcd.setCursor(0,3);
       lcd.print(" sekcja 5");
       poz = 4;}
if(16 <= newPosition && newPosition < 20){
       lcd.clear();
       lcd.home();
       lcd.print(" sekcja 3");
       lcd.setCursor(0,1);
       lcd.print(" sekcja 4");
       lcd.setCursor(0,2);
       lcd.write(1);
       lcd.print("sekcja 5");
       lcd.setCursor(0,3);
       lcd.print(" sekcja 6");
       poz = 5;
}
if(20 <= newPosition && newPosition < 24){
       lcd.clear();
       lcd.home();
       lcd.print(" sekcja 4");
       lcd.setCursor(0,1);
       lcd.print(" sekcja 5");
       lcd.setCursor(0,2);
       lcd.write(1);
       lcd.print("sekcja 6");
       lcd.setCursor(0,3);
       lcd.print(" sekcja 7");
       poz = 6;
}
if(24 <= newPosition && newPosition < 28){
       lcd.clear();
       lcd.home();
       lcd.print(" sekcja 5");
       lcd.setCursor(0,1);
       lcd.print(" sekcja 6");
       lcd.setCursor(0,2);
       lcd.write(1);
       lcd.print("sekcja 7");
       lcd.setCursor(0,3);
       lcd.print(" sekcja 8");
       poz = 7;
}
if(28 <= newPosition && newPosition < 32){
       lcd.clear();
       lcd.home();
       lcd.print(" sekcja 5");
       lcd.setCursor(0,1);
       lcd.print(" sekcja 6");
       lcd.setCursor(0,2);
       lcd.print(" sekcja 7");
       lcd.setCursor(0,3);
       lcd.write(1);
       lcd.print("sekcja 8");
       poz = 8;}
        if(newPosition > 32){
        myEnc.write(32);} 
        if(newPosition < 0){
        myEnc.write(0);}}
if(Sm == 2){
       J = newPosition;
       lcd.clear();
       lcd.setCursor(4,0);
       lcd.print("Jasnosc  LED");
       lcd.setCursor(7,2);
       lcd.print(J);   
if(newPosition > 255){
        myEnc.write(255);} 
if(newPosition<0){
        myEnc.write(0);}
    }
if(Sm == 3){


  }
}
}

void singleClick(){
if(poz == 1 && Sm == 0){
      Sm = 1;
      poz = 1;
      lcd.clear();
      lcd.home();
      lcd.write(1);
      lcd.print("sekcja 1");
      lcd.setCursor(0,1);
      lcd.print(" sekcja 2");
      lcd.setCursor(0,2);
      lcd.print(" sekcja 3");
      lcd.setCursor(0,3);
      lcd.print(" sekcja 4");}
if(poz == 2 && Sm == 0){
      Sm = 2;
      lcd.clear();
      lcd.setCursor(4,0);
      lcd.print("Jasnosc  LED");
      lcd.setCursor(7,2);
      lcd.print(J);
      myEnc.write(J);}
if(poz == 3 && Sm == 0){
      Sm = 3;
      poz = 0;
      lcd.clear();
      lcd.setCursor(7,0);
      lcd.print("Reczne");
      lcd.setCursor(0,1);
      lcd.write(1);
      lcd.print("R");
      lcd.setCursor(7,1);
      lcd.print(R);
      lcd.setCursor(0,2);
      lcd.print(" G");
      lcd.setCursor(7,2);
      lcd.print(G);
      lcd.setCursor(0,3);
      lcd.print(" B");
      lcd.setCursor(7,3);
      lcd.print(B);}

/* if(poz == 1 && Sm == 1 && SL1 == LOW)
  {SL1 = HIGH;}
  else{SL1 = LOW;}
 
  if(poz == 2 && Sm == 1 && SL2 == LOW)
  {SL2 = HIGH;}
  else{SL2 = LOW;}

  if(poz == 3 && Sm == 1 && SL3 == LOW)
  {SL3 = HIGH;}
  else{SL3 = LOW;}

  if(poz == 4 && Sm == 1 && SL4 == LOW)
  {SL4 = HIGH;}
  else{SL4 = LOW;}

  if(poz == 5 && Sm == 1 && SL5 == LOW)
  {SL5 = HIGH;}
  else{SL5 = LOW;}

  if(poz == 6 && Sm == 1 && SL6 == LOW)
  {SL6 = HIGH;}
  else{SL6 = LOW;}

  if(poz == 7 && Sm == 1 && SL7 == LOW)
  {SL7 = HIGH;}
  else{SL7 = LOW;}

  if(poz == 8 && Sm == 1 && SL8 == LOW)
  {SL8 = HIGH;}
  else{SL8 = LOW;}
 
  if(poz == 1 && Sm == 1 && l5 == 0){l1 = 10;}
  else{l1 = 0;}
 
  if(poz == 2 && Sm == 1 && l6 == 0){l2 = 10;}
  else{l2 = 0;}
 
  if(poz == 3 && Sm == 1 && l7 == 0){l3 = 10;}
  else{l3 = 0;}
 
  if(poz == 4 && Sm == 1 && l8 == 0){l4 = 10;}
  else{l4 = 0;}
 
  if(poz == 5 && Sm == 1 && l5 == 0){l5 = 10;}
  else{l5 = 0;}
 
  if(poz == 6 && Sm == 1 && l6 == 0){l6 = 10;}
  else{l6 = 0;}
 
  if(poz == 7 && Sm == 1 && l7 == 0){l7 = 10;}
  else{l7 = 0;}
 
  if(poz == 8 && Sm == 1 && l8 == 0){l8 = 10;}
  else{l8 = 0;}*/
}

void doubleClick(){
if(Sm == 1){
    Sm = 0;
    poz = 1;
    lcd.clear();
    lcd.home();
    lcd.write(1);
    lcd.print("Sterowanie");
    lcd.setCursor(0,1);
    lcd.print(" Taras all");
    lcd.setCursor(0,2);
    lcd.print(" Funkcje");
    lcd.setCursor(0,3);
    lcd.print(" Wylaczenie");
    myEnc.write(0);}
if(Sm == 2){
    Sm = 0;
    poz = 1;
    lcd.clear();
    lcd.home();
    lcd.write(1);
    lcd.print("Sterowanie");
    lcd.setCursor(0,1);
    lcd.print(" Taras all");
    lcd.setCursor(0,2);
    lcd.print(" Funkcje");
    lcd.setCursor(0,3);
    lcd.print(" Wylaczenie");}
if(Sm == 3){
    Sm = 0;
    poz = 1;
    lcd.clear();
    lcd.home();
    lcd.write(1);
    lcd.print("Sterowanie");
    lcd.setCursor(0,1);
    lcd.print(" Taras all");
    lcd.setCursor(0,2);
    lcd.print(" Funkcje");
    lcd.setCursor(0,3);
    lcd.print(" Wylaczenie");}
if(Sm == 4){
      lcd.clear();
      lcd.setCursor(7,0);
      lcd.print("Reczne");
      lcd.setCursor(0,1);
      lcd.write(1);
      lcd.print("R");
      lcd.setCursor(7,1);
      lcd.print(R);
      lcd.setCursor(0,2);
      lcd.print(" G");
      lcd.setCursor(7,2);
      lcd.print(G);
      lcd.setCursor(0,3);
      lcd.print(" B");
      lcd.setCursor(7,3);
      lcd.print(B);
      Sm = 3;
      poz = 1;}
if(Sm == 5){
      lcd.clear();
      lcd.setCursor(7,0);
      lcd.print("Reczne");
      lcd.setCursor(0,1);
      lcd.write(1);
      lcd.print("R");
      lcd.setCursor(7,1);
      lcd.print(R);
      lcd.setCursor(0,2);
      lcd.print(" G");
      lcd.setCursor(7,2);
      lcd.print(G);
      lcd.setCursor(0,3);
      lcd.print(" B");
      lcd.setCursor(7,3);
      lcd.print(B);
      Sm = 3;
      poz = 1;}
if(Sm == 6){
      lcd.clear();
      lcd.setCursor(7,0);
      lcd.print("Reczne");
      lcd.setCursor(0,1);
      lcd.write(1);
      lcd.print("R");
      lcd.setCursor(7,1);
      lcd.print(R);
      lcd.setCursor(0,2);
      lcd.print(" G");
      lcd.setCursor(7,2);
      lcd.print(G);
      lcd.setCursor(0,3);
      lcd.print(" B");
      lcd.setCursor(7,3);
      lcd.print(B);
      Sm = 3;
      poz = 1;}
     
}
void longPress(){

  if(poz == 1 && Sm == 1 && SL1 == LOW)
  {SL1 = HIGH;}
  else{SL1 = LOW;}
 
  if(poz == 2 && Sm == 1 && SL2 == LOW)
  {SL2 = HIGH;}
  else{SL2 = LOW;}

  if(poz == 3 && Sm == 1 && SL3 == LOW)
  {SL3 = HIGH;}
  else{SL3 = LOW;}

  if(poz == 4 && Sm == 1 && SL4 == LOW)
  {SL4 = HIGH;}
  else{SL4 = LOW;}

  if(poz == 5 && Sm == 1 && SL5 == LOW)
  {SL5 = HIGH;}
  else{SL5 = LOW;}

  if(poz == 6 && Sm == 1 && SL6 == LOW)
  {SL6 = HIGH;}
  else{SL6 = LOW;}

  if(poz == 7 && Sm == 1 && SL7 == LOW)
  {SL7 = HIGH;}
  else{SL7 = LOW;}

  if(poz == 8 && Sm == 1 && SL8 == LOW)
  {SL8 = HIGH;}
  else{SL8 = LOW;}

}
 
Odpowiedź
#2
Najprawdopodobniej nie masz czego porządkować, bo menu wygląda wg własnego pomysłu i podziwiam, że się w tym jeszcze łapiesz. Zamiast wymyślać koło na nowo można skorzystać z jakiś gotowców, choćby na wzór.
U Ciebie pewnie ustawiasz zmienne na 1 tylko aktualnej pozycji menu jednocześnie zerując resztę bo nie jest aktualną pozycją, więc wszędzie zadziała to po "else".
 
Odpowiedź
#3
Wiem że robię wszystko na nowo ale chce się czegoś nauczyć ale z tym już wymieklem. Ogólnie mnie dziwi że to się wyłącza bo te funkcje sprawdza tylko przy kliknięciu jeżeli kursor jest na danej pozycji I dla tego stanąłem przed znak8em zapytania z jakiego powodu się to wyłącza. A mówiąc o gotówcu może masz jakieś menu na oku które nadało by się do tego celu.
 
Odpowiedź
#4
Tu jest proste menu: https://starter-kit.nettigo.pl/2017/04/m...aczu-16x2/. W swoim wystarczy, że przyjmiesz inną konstrukcję, np. switch case i break zamiast if/else. Sprawdzasz w której pozycji jest kursor i tylko dla tego przypadku wykonujesz ustawienie zmiennej ON/OFF, a nie że sprawdzany jest każdy if i tam gdzie jest kursor ewentualnie ustawiasz ON i każdą inną pozycję realizujesz z else na OFF.
 
Odpowiedź
#5
Przepraszam za odpowiedź dopiero teraz ale dopiero chwilę znalazłem. Dzięki twojej pomocy jako tako to zaczęło działać. jako tako się nie spodziewałem że to pomoże ale jednak. Teraz powalczę trochę z samą z budową menu i będzie super. jeszcze raz dziękuję i w razie czego będę się pod postem odzywał Tongue
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości