Nybörjare: Få en knapp att starta ett skeende (IF bla bla) fattar ej

Hej igen. Jag är som sagt helt ny på det här med kodning överhuvudtaget och nu har jag suttit i några timmar och försökt förstå vad jag gör för fel.

Jag har lyckats koppla en LCD display och får den att fungera. Jag har också kopplat en knapp som jag får fungera så kopplingarna är det inget fel på. Det är koden som jag inte förstår vad jag bör göra.

Jag vill alltså ha en en text som står innan jag trycker på en knapp samt en serie neopixlar (just nu är det dock bara en led på pin 13) som är avstängda tills jag trycker på knappen. Då skall en annan text dyka upp typ "skjuter" och neopixlarna börja blinka. Sedan när jag släpper knappen skall en "loading %" visas i LCDn och lamporna sluta blinka. Efter detta skall allt gå tillbaka till som det var innan knapptryckningen.

Här kommer min kod:

#include <LiquidCrystal.h>
const int buttonPin = 7;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte percentage_1[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 };
byte percentage_2[8] = { B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 };
byte percentage_3[8] = { B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100 };
byte percentage_4[8] = { B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110 };
byte percentage_5[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }; 

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  lcd.createChar(0, percentage_1);
  lcd.createChar(1, percentage_2);
  lcd.createChar(2, percentage_3);
  lcd.createChar(3, percentage_4);
  lcd.createChar(4, percentage_5);
  
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print("Laddar upp");
  delay(2000);
  lcd.clear();
  lcd.print("Ektoplasma 13%");
  delay(2000);
  lcd.clear();
  
}

void loop() {     

  
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == LOW) {
for(int i = 0; i <= 100; i++){
    lcd.setCursor(0,0);  
    lcd.print("Loading :");
    lcd.print(i);
    lcd.print("%");
    lcd_percentage(i, 0, 16, 1);
    delay(50);
  }
  
  lcd.clear();

}

void lcd_percentage(int percentage, int cursor_x, int cursor_x_end, int cursor_y){
  
  int calc = (percentage*cursor_x_end*5/100)-(percentage*cursor_x*5/100);
  while(calc >= 5){
    lcd.setCursor(cursor_x,cursor_y);
    lcd.write((byte)4);
    calc-=5;
    cursor_x++;
  }
  while(calc >= 4 && calc < 5){
    lcd.setCursor(cursor_x,cursor_y);
    lcd.write((byte)3);
    calc-=4;

  }
  while(calc >= 3 && calc < 4){
    lcd.setCursor(cursor_x,cursor_y);
    lcd.write((byte)2);
    calc-=3;
  }
  while(calc >= 2 && calc < 3){
    lcd.setCursor(cursor_x,cursor_y);
    lcd.write((byte)1);
    calc-=2;
  }
  while(calc >= 1 && calc < 2){
    lcd.setCursor(cursor_x,cursor_y);
    lcd.write((byte)0);
    calc-=1;
  }
    // turn LED on:
    digitalWrite(ledPin, LOW);
  } else {
    // turn LED off:
    digitalWrite(ledPin, HIGH);
  }
  
}

Här är alltså koden. Jag inser ju att det är nått enkelt jag missar i språket men kan inte lista ut vad jag gör för fel.

Hej! Jag tror att det kan vara ett debouncingproblem. Vet inte om du är bekant med begreppet, men googla på det annars. Enkelt uttryckt är det så att när du trycker ner knappen sker några hundra små mikrosekundsnabba fluktuationer i spänningen innan den stabilseras i det nya läget. Kallas "bounce". Arduinon med sin binära tolkning upplever det som lika många knapptryckningar. Man brukar lösa det med en liten delay direkt efter avläsningen. Det finns också delay-fria metoder och bibliotek som löser detta.

Alla andra problem med koden blir ju enklare att hjälpa dig förstå om du också beskriver vad som händer nu. D.v.s vad det är som INTE fungerar.

Jag blir inte helt klok på vad du vill att koden skall åstadkomma i sin nuvarande form. Jag läser den så här:

Direkt när arduinon startar så kollar den knappen. Om du då inte har den intryckt börjar den genast gå in i en massa loopar som du har definierat och låses där. I looparna läser den inte alls av knappen. Det betyder ju att om du inte har knappen intryckt redan när du startar arduinon så händer allt på en gång och det finns inget du kan göra åt det. Stämmer det med ditt problem?

Sen blir det också lättare att hjälpa dig om du bjuder på lite fler kommentarer i koden om vad du vill att varje rad skall åstadkomma.