Accionar Relé.

Hola soy nuevo en Arduino, Agradezco me puedan ayudar con este programa.

Quiero controlar una bomba usando Arduino Nano, un sensor ultrasonico, un rele, y un pulsador. la idea es que el cuando el sensor detecte un objeto a una distancia de 60cm accione el rele durante un tiempo determinado, pero necesito que el tiempo se pueda cambiar usando el pulsador (entre 8 a 15 segundos). La detección ya esta funcionando y accionando el rele, pero no se como hacer la rutina para cambiar el tiempo con el pulsador.

Agradezco su ayuda.

Este es mi sketch

#include <NewPing.h>

#define TRIGGER_PIN 10
#define ECHO_PIN 9
#define MAX_DISTANCE 200

const int buttonPin = 7;

int buttonState = 0;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
pinMode(buttonPin, INPUT);

}

void loop() 
{
delay(1000);
int uS = sonar.ping_median();
Serial.print("Distancia: ");
Serial.print(uS / US_ROUNDTRIP_CM);
Serial.println("cm");
buttonState = digitalRead(buttonPin);

if (uS / US_ROUNDTRIP_CM>60) {
digitalWrite(3, HIGH);
delay(10);
digitalWrite(10, LOW);

 
}
else {
digitalWrite(3, LOW);
delay(12000);
digitalWrite(10, LOW);

}

}

Yo intentaría algo así
Declaro una variable global:

uint32_t countTime;

Y en el loop algo así:

uint32_t t = millis();
If(digitalRead(pinPush) && t - countTime > 500){
  tiempoRele = tiempoRele + 1;
  If tiempoRele>15){
    tiempoRele = 8;
    }
countTime = millis();
}

Ese código debería ir incrementando una unidad por cada 500 ms el valor de la variable "tiempoRele" mientras lee un 1 lógico en el pin "pinPush".

Te sugiero que veas los tutoriales de control de tiempo con millis, el uso de delay no es bueno y se debe evitar cuando sea posible, esto limita al micro a no hacer nada (literal) mientras esta en delay, con otra estrategia se puede aprovechar ese tiempo de trabajo a tal punto que podríamos emular multitarea con el micro.

Saludos y éxito.

Hola, vi tu codigo y no entiendo para que usas el pin 10 de arduino. Ya que lo pones low y low.

Mira, yo tambien soy principiante, pero si hay algo que te pueda recomendar es el ordenar el codigo.

Por ejemplo yo pongo una condicion y una accion asi:

if (estado == 2)         {  Serial.print("Estoy detectando estado 2 "); 
                            if (temp < 30.00) 
                                        {digitalWrite(relay1, LOW); digitalWrite(relay2, LOW);}
                            else estado = 0 ;
                         }

con formato escalonado…

Te recomiendo tambien poner un lcd que te undique cuando es el tiempoRele, o algo que te lo indique como un buzzer…

Bueno espero que postees tu nuevo codigo :slight_smile: saludos

El TRIGGER_PIN 10 no debería ponerse en LOW para nada porque lo afectaste al control del sensor Ultrasónico y hacerlo no tiene sentido.

Verifica este código a ver si funciona mas o menos como esperas.
Asumo que presionando de a una vez cambias de 8 a 15 segundos es modificable a lo que desees.

#include <NewPing.h>

#define TRIGGER_PIN   10
#define ECHO_PIN      9
#define MAX_DISTANCE  200

const int buttonPin = 7;
bool buttonState, buttonStateAnt = false;
unsigned logn start, tiempo = 8*1000, demoro;   // 8 x 1000 mseg

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  
  if (millis() - start > 1000UL) {
      int uS = sonar.ping_median();
      Serial.print("Distancia: ");
      Serial.print(uS / US_ROUNDTRIP_CM);
      Serial.println("cm");
  }
  
  buttonState = digitalRead(buttonPin); // no haces nada con el boton
  if (buttonState && buttonStateAnt ) {
      tiempo += 1000
      if (tiempo > 15)
          tiempo = 8000;    // 8000 = 8 segundos
      estado = 0;
  }
  buttonStateAnt = buttonState;

  if (uS / US_ROUNDTRIP_CM>60) {
      digitalWrite(3, HIGH);
  }
  else {
      
      switch(estado) {
          case 0: digitalWrite(3, LOW);
                  estado = 1;
                  demoro = millis();
                  break;
          case 1: if (millis() - demoro > tiempo) {
                      estado = 2;
                  }
                  break;
          case 2: break;
      }
  }
}

La diferencia de este código esta en que si el objeto esta a una distancia menor a 60 cm y durante el lapso de tiempo cambia a > 60, pues cambiará porque acá no hay delay.

Hola muchas gracias a todos por su ayuda.

@surbyte esto tratando de compilar pero obtengo este error.

“‘estado’ was not declared in this scope” en la linea 43

Muchas gracias.

Hola, tenes que definir la variable estado al principio.

asi

int estado = 0;

a mi me sirvio definirla como int.

lo agregas en esta parte al principio

#include <NewPing.h>

#define TRIGGER_PIN 10
#define ECHO_PIN 9
#define MAX_DISTANCE 200

const int buttonPin = 7;

int buttonState = 0;

vamos que contigo tendre mi primer punto de Karma :smiley: ja ja

Cuando declaro ela variable estado me aparece otro error en la linea

  if (uS / US_ROUNDTRIP_CM>60) {

'uS' was not declared in this scope

He intentado varias cosas pero no lo he logrado.

Gracias

Hola androco,

En cuando a la variable uS, lo unico que puedo decirte es que la definas globalmente, es decir al principio de todo antes del void setup. Tu codigo la define dentro de un IF, por lo que supongo que si no se cumple ese if, no la define... calculo que esa es la causa.

Tambien veo algo parecido con la variable "US_ROUNDTRIP_CM" no esta definida. Deberias hacerlo creo yo.

Saludos!

@androco el código inicial lo has traído tu, de algún ejemplo de newping.h De modo que revisa dicho ejemplo.

acá lo tienes definido

int uS = sonar.ping_median();  // <== definición de uS
Serial.print("Distancia: ");
Serial.print(uS / US_ROUNDTRIP_CM);
Serial.println("cm");
buttonState = digitalRead(buttonPin);

if (uS / US_ROUNDTRIP_CM>60) {

Si tu mismo no sabes donde esta definido?

Lo mejor es que lo hagas al comiendo de void loop o como global.

Pero eso es básico de como programar, te aconsejo que te pongas a leer o ver tutoriales de Arduino.
Hay cuestiones que no se pueden transmitir sin que uno se siente a estudiar por su cuenta.
No lo tomes como un mal consejo sino algo que te permitirá a ti avanzar con mas rapidez, considera el tiempo que llevas estancado con esto?

Ok muchas gracias por su ayuda!!!