PALMAS E ULTRASOM JUNTOS?

SOCORRO… :o

basicamente um projeto de uma escada…

vou usar 2 sensores ultrasom (um subir e outro descer)
mas queria usar um sensor de palmas para uma luz “fraca” ou cortesia (2 palmas)
e outra luz embaixo escada (luzJardim)

PROBLEMA: se eu isolar a parte do ultrasom ou palmas, ambas funcionam, quando junto as 2 partes, as palmas não funciona…
O QUE SERA?

OBS: No programa abaixo resumi em 3 degraus…

È exatamente conforme video: Automação escada com Arduíno projeto finalizado - YouTube

Projeto original Escada inteligente V1.4
Autor: Marcio Franco
Data:15/08/2016


/*
 Projeto Escada inteligente V1.0
 Autor: ROBSON BURGHERI
 Data:25/11/2018

 
 

*/

#include <NewPing.h>

#define TRIGGER_PIN  37  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_SOBE    24  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define ECHO_DESCE   40  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 4000 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sobe(TRIGGER_PIN, ECHO_SOBE, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
NewPing desce(TRIGGER_PIN, ECHO_DESCE, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

#define pinSom 32
#define ledJardim 31
#define tempoMaximoDeUmaPalma  120 //milisegundos
#define tempoMaximoEntrePalmas 350 //milisegundos

int contaPalmas = 0;
long tempoEspera = 0;
long tempoEsperaEntrePalmas = 0;
int cortesia = 0;             //verifica se esta ligado ou nao a cortesia caso ligada joga o fade apartir do brilho da cortesia

const int ledPin = 2;
const int ledPin2 = 3;
const int ledPin3 = 4;


const int fadingDelay = 50;  // Velocidade do LED fading (Quanto maior mais lento).
const int transicao = 20;    // Tempo para ligar o proximo led (utilizei o delay).
const int passo = 2;         // Passo do fading deixa a transição mais suave e lenta ou mais rapida e mais abrupta.


void executarAcao();


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

 pinMode(digitalPin, OUTPUT);    //DEBUGG LED 33
 pinMode(pinSom, INPUT);
 pinMode(ledJardim, OUTPUT);
 pinMode(ledPin, OUTPUT);
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);

}

void loop() {


//**************** ROTINA ULTRASOM *************************

 delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
 Serial.print("Distância   SOBE: ");
 Serial.print(sobe.ping_cm()); // _cmSend ping, get distance in cm and print result (0 = outside set distance range)
 Serial.println("cm");
 delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
 Serial.print("                    **********  Distância   DESCE: ");  
 Serial.print(desce.ping_cm()); // _cmSend ping, get distance in cm and print result (0 = outside set distance range)
 Serial.println("cm");

 int up = sobe.ping_cm();//
 int dow = desce.ping_cm();//_cm

//*********************************************************


//************** SUBINDO***********************************


   if (up <= 15){
     if (up != 0) {      
       Serial.println("Sensor de movimento de subida acionado");

     if (cortesia == 1) {
       Serial.println("cortesia ligada e dentro do subir");

       int b = 6;
       int q = 6;
       int g = 6;

       for (int i = b; i <= 110; i += passo) {
         analogWrite(ledPin, i);
         delay(transicao);
       }
       for (int j = q; j <= 110; j += passo) {
         analogWrite(ledPin2, j);
         delay(transicao);
       }
       for (int k = g; k <= 110; k += passo) {
         analogWrite(ledPin3, k);
         delay(transicao);
       }
       
       delay(2000);

       Serial.println("Desligando luzes apos subir e deixando a cortesia ligada");

       for (int l = 110; l >= 6; l -= passo) {
         analogWrite(ledPin, l);
         delay(transicao);
       }

       for (int p = 110; p >= 6; p -= passo) {
         analogWrite(ledPin2, p);
         delay(transicao);
       }

       for (int r = 110; r >= 6; r -= passo) {
         analogWrite(ledPin3, r);
         delay(transicao);
       }

       


// **************DESCENDO**********************
//*********************************************


   if (dow <= 15){    
     if (dow != 0) {    

     Serial.println("Sensor de movimento de descida acionado");

     if (cortesia == 1) {
       Serial.println("cortesia ligada e dentro do descer");

       int b = 6;
       int q = 6;
       int g = 6;



       for (int i = b; i <= 110; i += passo) {
         analogWrite(ledPin3, i);
         delay(transicao);
       }
       for (int j = q; j <= 110; j += passo) {
         analogWrite(ledPin2, j);
         delay(transicao);
       }
       for (int k = g; k <= 110; k += passo) {
         analogWrite(ledPin, k);
         delay(transicao);
       }

       delay(2000);

       Serial.println("Desligando Luzes descendo e deixando a cortesia ligada");



       
       for (int l = 110; l >= 6; l -= passo) {
         analogWrite(ledPin3, l);
         delay(transicao);
       }

       for (int p = 110; p >= 6; p -= passo) {
         analogWrite(ledPin2, p);
         delay(transicao);
       }

       for (int r = 110; r >= 6; r -= passo) {
         analogWrite(ledPin, r);
         delay(transicao);
       }
     }
    

//***************** PALMAS ******************
 
 //verifica o estado do sensor de som (ele fica normalmente com a porta ligada. Quando ouver uma palma, ele desliga momentaneamente a porta)
 int sensorSom = digitalRead(pinSom);

 //se o sensor detectou palmas
 if (sensorSom == LOW) {

    //espera um tempo para nao detectar a mesma palma mais de uma vez 
    if (tempoEspera == 0) {
       tempoEspera = tempoEsperaEntrePalmas = millis(); 
       contaPalmas++;
    } else if ((millis() - tempoEspera) >= tempoMaximoDeUmaPalma) {
       tempoEspera = 0;
    }
 }

 //caso exceda o tempo maximo entre palmas, zera o contador de palmas
 if ( (contaPalmas != 0) && ((millis() - tempoEsperaEntrePalmas) > 500) ) {
    executarAcao();
    contaPalmas = 0;
    tempoEsperaEntrePalmas = millis();
 }
}
}

void executarAcao() //  AÇÃO PARA QUANDO BATER PALMAS
{
Serial.println("contaPalmas");
Serial.println(               contaPalmas);
 switch (contaPalmas) 
 {  
   /*case 2:                                                     //se tiver 2 palmas...
       if (cortesia == 0){
       
       for (int i = 0; i <= 6; i += 1) {
         analogWrite(ledPin, i);
         analogWrite(ledPin2, i);
         analogWrite(ledPin3, i);
         analogWrite(ledPin4, i);
         analogWrite(ledPin5, i);
         analogWrite(ledPin6, i);
         analogWrite(ledPin7, i);
         analogWrite(ledPin8, i);
         analogWrite(ledPin9, i);
         analogWrite(ledPin10, i);
         analogWrite(ledPin11, i);
         analogWrite(ledPin12, i);
         analogWrite(ledPin13, i);
         analogWrite(ledPin14, i);
         analogWrite(ledPin15, i);
         delay(50);
       }
       cortesia = 1;
         break;
     }
   
   case 3:                                                     //se tiver 3 palmas...
     if (cortesia == 1) {
       
       for (int l = 6; l >= 0; l -= 1) {
         analogWrite(ledPin, l);
         analogWrite(ledPin2, l);
         analogWrite(ledPin3, l);
         analogWrite(ledPin4, l);
         analogWrite(ledPin5, l);
         analogWrite(ledPin6, l);
         analogWrite(ledPin7, l);
         analogWrite(ledPin8, l);
         analogWrite(ledPin9, l);
         analogWrite(ledPin10, l);
         analogWrite(ledPin11, l);
         analogWrite(ledPin12, l);
         analogWrite(ledPin13, l);
         analogWrite(ledPin14, l);
         analogWrite(ledPin15, l);
         delay(50);
       }
       cortesia = 0;
       break;
     }*/
         case 2:             //se tiver 4 palmas...
      digitalWrite(ledJardim, !digitalRead(ledJardim)); //! inverte a ação
      break;
 }
 Serial.println("cortesia");
 Serial.println(               cortesia);
}

Antes de mais nada, leia: How to use this forum - please read

Edite seu post e coloque o código dentro de tags [ code]seu código aqui[ /code] para facilitar a leitura.

Veja que na rotina de PALMAS, você não usa delay() algum:

//***************** PALMAS ******************
  
  //verifica o estado do sensor de som (ele fica normalmente com a porta ligada. Quando ouver uma palma, ele desliga momentaneamente a porta)
  int sensorSom = digitalRead(pinSom);

  //se o sensor detectou palmas
  if (sensorSom == LOW) {

     //espera um tempo para nao detectar a mesma palma mais de uma vez 
     if (tempoEspera == 0) {
        tempoEspera = tempoEsperaEntrePalmas = millis(); 
        contaPalmas++;
     } else if ((millis() - tempoEspera) >= tempoMaximoDeUmaPalma) {
        tempoEspera = 0;
     }
  }

  //caso exceda o tempo maximo entre palmas, zera o contador de palmas
  if ( (contaPalmas != 0) && ((millis() - tempoEsperaEntrePalmas) > 500) ) {
     executarAcao();
     contaPalmas = 0;
     tempoEsperaEntrePalmas = millis();
  }

Já na rotina de ULTRASSOM, você usa delay():

//**************** ROTINA ULTRASOM *************************

  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Distância   SOBE: ");
  Serial.print(sobe.ping_cm()); // _cmSend ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");
  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("                    **********  Distância   DESCE: ");  
  Serial.print(desce.ping_cm()); // _cmSend ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

  int up = sobe.ping_cm();//
  int dow = desce.ping_cm();//_cm

Como o uso de delay() introduz código bloqueante, a solução é substituir por millis(), leia: Using millis() for timing. A beginners guide.

Note que não é apenas nos trechos que citei que é utilizado delay(), mas em vários outros lugares, sendo necessárias mudanças significativas.

Tente mudar tudo para apenas millis(), nos mostre as tentativas e traga as dúvidas.

Obrigado giova014 !!!!!

Corrigido o post!

Vou verificar todo o programa com as observações que fizeste e posto aqui o retorno!!!