Tengo problemas con el código de un simulador sísmico

Hola, estoy trabajando en un simulador sísmico y tengo dos problemas.

El primero es que necesito que se ejecute una sola ves el código “void starting” en el “loop”. Esta no se puede colocar en el “setup”, cosa que ya intente.

El segundo problema que tengo es que necesito controlar la cantidad de veces que se mueva un servo motor con un demmer, no controlar el angulo en el que se mueve el servo no el demmer, sino el tiempo que tarda este en moverse del angulo 45 al 135. Este esta en el “void servoSismic”.

Todo esta listo excepto estas dos cosas.

/*
  LCD:
  d4 = pin12
  d6 = pin11
  d11 = pin5
  d12 = pin4
  d13 = pin3
  d14 = pin2
  blk = GND
  wht = VCC
*/

#include <Servo.h>
#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Servo microServo;
Servo servoMG995;

const int ledV = 10;
const int ledR = 9;
const int btn = 6;
const int intLed = 13;

const int pinMicroServo = 7;
const int pulsoMinMS = 580;
const int pulsoMaxMS = 2490;

const int pinServoMG995 = 8;
const int pulsoMinMG = 1000;
const int pulsoMaxMG = 2000;

int stateBtn = 0;
int stateInt = 0;

void setup() {
  microServo.attach(pinMicroServo, pulsoMinMS, pulsoMaxMS);
  servoMG995.attach(pinServoMG995, pulsoMinMG, pulsoMaxMG);

  lcd.begin(20, 2);

  pinMode(ledV, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(btn, INPUT);
  pinMode(intLed, INPUT);
}

void loop() {
  stateInt = digitalRead(intLed);
  if (stateInt == HIGH) {
    lcd.clear();
    delay(100);

    starting();

    pressButton();

    digitalWrite(ledV, LOW);
    digitalWrite(ledR, LOW);

    microServo.write(90);
    servoMG995.write(90);

    stateBtn = digitalRead(btn);
    if (stateBtn == HIGH) {
      lcd.clear();
      delay(100);

      servoSismic();
    }
    else {
      pressButton();
    }
  }
  else {
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print("Seismic Simulator");
    delay(500);
  }
}

//////////////////////////////////////////////////Starting//////////////////////////////////////////////////
void starting() {
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("system is running");
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print("system is running");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("#                   ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("##                  ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("###                 ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("####                ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("#####               ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("######              ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("#######             ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("########            ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("#########           ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("##########          ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("###########         ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("############        ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("#############       ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("##############      ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("###############     ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("################    ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("#################   ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("##################  ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("################### ");
  delay(100);
  lcd.setCursor(0, 1);
  lcd.print("####################");
  delay(500);
  lcd.setCursor(0, 0);
  lcd.print("####################");
  lcd.setCursor(0, 1);
  lcd.print("done                ");
  delay(2500);
}

//////////////////////////////////////////////////Press Button//////////////////////////////////////////////////
void pressButton() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Presione Boton para");
  lcd.setCursor(6, 1);
  lcd.print("Activar");
  delay(3000);
  lcd.clear();
  delay(500);
  lcd.setCursor(2, 0);
  lcd.print("Press Button to");
  lcd.setCursor(6, 1);
  lcd.print("Activate");
  delay(3000);
  lcd.clear();
  delay(500);
}

//////////////////////////////////////////////////Servo Sismic//////////////////////////////////////////////////
void servoSismic() {
  lcd.setCursor(0, 0);
  lcd.print(" Simulador Sismico  ");
  lcd.setCursor(5 , 1);
  lcd.print(" Activado");
  delay(3000);
  lcd.setCursor(1, 0);
  lcd.print("Seismic Simulator");
  lcd.setCursor(5, 1);
  lcd.print("Activated");
  delay(3000);
}

Si quieres hacer un simulador y controlar cosas usando delay() ya empiezas mal.

Lee millis() en esta ubicación del foro.
Ve a Documentación => Indice de temas tutoriales => millis() y tmb lee máquina de estados.

Hay que reformular ambas cosas.
Mas alla de lo que pides, que se puede resolver sin cambiar esto o al menos eso creo, luego tu programa crecerá y llegará el momento en que no puedas hacer lo que quieres x los delay(). Mejor eliminarlos AHORA!!

Gracias surbyte voy a ver de cambiar esto.

Es muy extraño que no puedas ejecutar el void starting() en el setup. Deberías poder. La otra opción es con un flag ( máquina de estados). Declaras una variable=0 y en el loop mediante un if consultas el valor de la misma . Si es =0 ejecutas tu función e incrementas tu variable, si no es =0 sigues con el programa. De ésta forma sólo se va a ejeutar la primera vez que pases por el void loop().

Gracias Pablo_Lucini voy a probar con eso a ver si me resulta.

Tambien necesito hacer un contador qu parta en 10 segundo y que ademas tenga los milisegundos, porque con los delay que era lo que se me ocurrio en un principio no me resulto y no lo puedo subir al arduino.

Si alguno sabe como hacerlo estaria muy agradecido.

En mi primer respuesta ya te indiqué que delay() solo trae problemas

Ve a Documentación => Indice de temas tutoriales => millis()

Hola, necesito que cuando llegue a simulatorAct(); se quede ahi hasta que se apague el interruptor y luego se ejecute el “if” de la linea 36 y que después pase al “else” de la linea 50. Intente usar flag pero no me funciono.

Si alguno me puede ayudar con el código estaría muy agradecido.

lcdRGB.ino (15.7 KB)

Y cual es el interruptor?
En tu primer código hay un interruptor aparentemente pero en el ultimo no.

Intenta explicarnos bien las cosas porque es dificil entender el problema.

El interruptor lo tengo como btn y lo que quiero hacer es que hasta que el btn no pase de estado 1 a 0 se ejecute simulatorAct() y cuando pase de 1 a 0 se ejecute el "if" de la linea 36 y que después pase al "else" de la linea 50, he tratado de diferentes maneras pero nunca logro.

Entiende bien lo que digo, porque no pretendo ofender a nadie, tu código esta muy mal hecho, corregir eso tal como ésta es un problema.
Es una pena que no uses millis() y máquina de estado.

No tengo tiempo para hacerlo ahora, si esperas unos días puede ser.
Si esto es el flanco de 0 a 1 dime que es la parte del esle

if (!stateBtn && stateBtnAnt) {
      lcd.setRGB(255, 255, 255);
      lcd.setCursor(0, 0);
      lcd.print(" Shutting Down  ");
      lcd.setCursor(0, 1);
      lcd.print("     System     ");
      delay(5000);

      digitalWrite(ledBtn, LOW);
  }
  else {
    digitalWrite(ledBtn,  LOW);
    lcd.setRGB(0, 0, 0);
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("                ");
    delay(100);
  }

Todo lo que no sea 0 a 1 o sea.. 1 a 0 que lo definiste antes.
También será 0 0 y 1 1 cosas que no se si se pueden dar. Ahora son comportamientos no esperados.
Ese else genera mas problemas que soluciones.

Si esta es la parte,

void loop() {
  stateBtn = digitalRead(btn);                             //Necesito que cuando se encienda el interruptor
  if ((stateBtn == HIGH) && (flag == false)) {     //pase a esta parte del código

    digitalWrite(ledBtn, HIGH);

    starting();

    regresiveCount();

    flag == true;

    simulatorAct();
  }

  stateBtn = digitalRead(btn);                              //Una vez que se apague el interruptor pase a esta
  if ((stateBtn == LOW) && (flag == true)) {        //parte del código
    lcd.setRGB(255, 255, 255);
    lcd.setCursor(0, 0);
    lcd.print(" Shutting Down  ");
    lcd.setCursor(0, 1);
    lcd.print("     System     ");
    delay(5000);

    digitalWrite(ledBtn, LOW);

    flag == false;

  }

  else {                                                       //Pero me pasa directamente al else en vez de al segundo if
    digitalWrite(ledBtn,  LOW);                      //si supiera como usar millis(), eso reduciría mis problemas

    lcd.setRGB(0, 0, 0);

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

    delay(100);
  }
}

No has comprendido lo que te he indicado.
En el ultimo control de flanco el else hace cualquier cosa. Eso debes restringirlo.
Luego tu código abusa del delay() por eso que requiere de una reprogramación completa usando millis() y una máquina de estados.

A ver si luego puedo orientarte con una para que entiendas cómo hacerlo.