How to make void setup wait for a button response

I want the void setup part of the code change depending of which button is pressed.
I've tried doing like this:

        bool butState = digitalRead(button1);
        bool ButtonState = digitalRead(Button);

        while(butState & ButtonState == false){
          Serial.println("waiting for response...");
          delay(1000);
        }

        if(button1 == HIGH){
          initPPKBaseConfig();
        }
        else if(Button == HIGH){
          initRTKBaseConfig();
        }

here is whole void setup I made:

void setup(){
    Serial.begin(250000); //activate serial.
    Wire.begin(SDA, SCL, 400000); // begin i2c comunication.
    pinMode(LED, OUTPUT);
    pinMode(yellow, OUTPUT);
    pinMode(green, OUTPUT);
    pinMode(Button,INPUT);
    pinMode(but, INPUT);
    delay(5000);
    Serial.println("inicializing Serial.");
    delay(150);
    digitalWrite(LED, HIGH);

    initSDCard();

    myFile = sd.open("testFolder/RXM_RAWX.ubx", FILE_WRITE);

    myGNSS.setFileBufferSize(fileBufferSize); // setFileBufferSize must be called _before_ .begin

    myGNSS.disableUBX7Fcheck();  // RAWX data can legitimately contain 0x7F, so we need to disable the "7F" check in checkUbloxI2C

    if (myGNSS.begin() == false){
          Serial.println(F("u-blox GNSS not detected at default I2C address. Please check wiring. Freezing...")); 
        digitalWrite(LED, HIGH);
        delay(150);
        digitalWrite(LED, LOW);
        delay(150);
        digitalWrite(LED, HIGH);
        delay(150);
        digitalWrite(LED, LOW);
        delay(150);
        digitalWrite(LED, HIGH);
        delay(150);
        digitalWrite(LED, LOW);
        delay(150);
        digitalWrite(LED, HIGH);
        delay(150);
        digitalWrite(LED, LOW);
        delay(150);

         while (1);
    }

    myGNSS.factoryDefault(); 
    delay(5000);

        digitalWrite(LED, HIGH);
        delay(500);
        digitalWrite(LED, LOW);
        delay(500);
        digitalWrite(LED, HIGH);
        delay(500);
        digitalWrite(LED, LOW);
        delay(500);
        digitalWrite(LED, HIGH);
        delay(500);
        digitalWrite(LED, LOW);
        delay(500);
        digitalWrite(LED, HIGH);
        delay(500);
        digitalWrite(LED, LOW);
        delay(500); 

        myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)

        myGNSS.setSerialRate(921600); //921600

        myGNSS.setNavigationFrequency(1); //Produce one navigation solution per second (that's plenty for Precise Point Positioning)

        delay(1000);

        myGNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_GPS); // Make sure GPS is enabled (we must leave at least one major GNSS enabled!)
        myGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_SBAS); // Disable SBAS
        myGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_GALILEO); // Disable Galileo
        myGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_BEIDOU); // Disable BeiDou
        myGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_IMES); // Disable IMES
        myGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_QZSS); // Disable QZSS
        myGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_GLONASS); // Disable GLONASS

        delay(2000);

        bool butState = digitalRead(but);
        bool ButtonState = digitalRead(Button);

        while(butState & ButtonState == false){
          Serial.println("waiting for response...");
          delay(1000);
        }

        if(but == HIGH){
          initRTKBaseConfig();
        }
        else if(Button == HIGH){
          initPPKBaseConfig();
        }

        digitalWrite(yellow, HIGH);
        
}

For that to work, you MUST, somewhere in the "while" code either make a change to butState or to ButtonState. That means reading button1 or reading Button, just like you did initially.

BUT!!!! you must get rid of the delay!!!

1 Like

consider

const byte But1Pin = A1;
const byte But2Pin = A2;

// -----------------------------------------------------------------------------
void setup() {
    Serial.begin (9600);

    pinMode (But1Pin, INPUT_PULLUP);
    pinMode (But2Pin, INPUT_PULLUP);

    Serial.println ("select either button 1 or 2");

    while (1)  {
        if (LOW == digitalRead (But1Pin))  {
            Serial.println ("button 1");
            break;
        }

        if (LOW == digitalRead (But2Pin))  {
            Serial.println ("button 2");
            break;
        }
    }
}

// -----------------------------------------------------------------------------
void loop()
{
}
1 Like

Had to made a ajustment, but it's working like charm.
thanks

Purists would go for while (true) { :wink:

2 Likes

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.