Arduino Polska Forum

Pełna wersja: Problem z menu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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;}

}
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".
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.
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.
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