Carro explorador (parte 3) Final

 En esta tercera parte se han agregado 2 sensores, sensor ultrasónico (SDM-IO) y el sensor de temperatura(TMP 36GZ), lo cual sus datos se mostrarán en la pantalla izquierda de la aplicación en el teléfono, también una luz roja que se enciende solo cuando la temperatura supera los 45°C.

 

Código del Arduino:

 

#include <Servo.h>

#define TxD 1 //definir pin TxD
#define RxD 0 //definir pin RxD

//enable
int STBY = 26; //standby

//Motores derechos
int PWM1 = 2; //velocidad motor 1, ruedas derechas
int IN11 = 22; //Dirección
int IN21 = 23; //Dirección

//Motores izquierdos
int PWM2 = 3; //velocidad motor 2, ruedas izquierdas
int IN12 = 27; //Dirección
int IN22 = 30; //Dirección

//otros
int dato = 0; // Asignación de variable, letra leía por el bluetooth
Servo myservo;//Asignación de nombre al servo
int var = 90;//Variable posición servo
int luz = 31;//Luz frontal
int sensorPin = 0;//pin del sensor de temperatura

//Datos del sensor ultrasonico
int pin = 34;
unsigned long time;
unsigned long sizeofpulse;
float distance;
///////////////////////////////

int luzsen = 35;//luz indica sen. temp. alta

//datos para sustituir el delay de la luz del sensor de temperatura
int ledState2 = HIGH; // Inicialmente esta apagado
unsigned long previousMillis2 = 0; //Sera el que diga en que ms fue la ultima vez que se encendio o apago
long OnTime2 = 1000; //Tiempo que el led rojo permanecera encendido
long OffTime2 = 750; //Tiempo que el led rojo permanecera apagado
////////////////////////////////////////////////////

//datos para sustituir el delay del sensor de temperatura
int ledState1 = HIGH;
unsigned long previousMillis1 = 0;
long OnTime1 = 500;
long OffTime1 = 500;
////////////////////////////////////////////////

//datos para sustituir el delay del sensor ultrasonico
int estado3 = HIGH; 
unsigned long previousMillis3 = 0; 
long OnTime3 = 1000; 
long OffTime3 = 1000; 
////////////////////////////////////////////////////


void setup() {

  Serial.begin(9600);

  pinMode(STBY, OUTPUT);

  pinMode(PWM1, OUTPUT);
  pinMode(IN11, OUTPUT);
  pinMode(IN21, OUTPUT);

  pinMode(PWM2, OUTPUT);
  pinMode(IN12, OUTPUT);
  pinMode(IN22, OUTPUT);

  pinMode(luz, OUTPUT);
  pinMode(luzsen, OUTPUT);

  myservo.attach(4);//Asignasión de pin al servo

}

//****************************************************************ciclo principal*********************************************************************

void loop() {

  if (Serial.available() > 0) {
    dato = Serial.read();
  }
  sen();
  if (isalpha(dato))//condición para saber si el dato es alfabético
  {
    if (dato == 'a') //al recibir la letra "a" ejecute lo siguiente, carro hacia delante
    {
      adelante(); //llama la función
    }
    if (dato == 'b')  //al recibir la letra "b" ejecute lo siguiente, el carro va a la derecha
    {
      derecha(); //llama la función
    }
    if (dato == 'c')  //al recibir la letra "c" ejecute lo siguiente, el carro va a la izquierda
    {
      izquierda(); //llama la función
    }
    if (dato == 'd')
    {
      digitalWrite(luz, LOW);
    }
    if (dato == 'e')
    {
      digitalWrite(luz, HIGH);
    }
    if (dato == 'g')  //al recibir la letra "g" ejecute lo siguiente, el carro se detiene
    {
      detenerse(); //llama la función
    }
    if (dato == 'k') //al recibir la letra "k" ejecute lo siguiente, carro hacia atras
    {
      atras(); //llama la función
    }
  }
  else {
    servo();
  }
}


//*****************************************************Funciones*************************************************************************


void adelante()
{
  digitalWrite(STBY, HIGH);
  analogWrite(PWM1, 255);
  analogWrite(PWM2, 255);
  digitalWrite(IN11, HIGH);
  digitalWrite(IN21, LOW);
  digitalWrite(IN12, LOW);
  digitalWrite(IN22, HIGH);
}

void atras()
{
  digitalWrite(STBY, HIGH);
  analogWrite(PWM1, 255);
  analogWrite(PWM2, 255);
  digitalWrite(IN11, LOW);
  digitalWrite(IN21, HIGH);
  digitalWrite(IN12, HIGH);
  digitalWrite(IN22, LOW);
}

void derecha()
{
  digitalWrite(STBY, HIGH);
  analogWrite(PWM1, 255);
  analogWrite(PWM2, 255);
  digitalWrite(IN11, LOW);
  digitalWrite(IN21, HIGH);
  digitalWrite(IN12, LOW);
  digitalWrite(IN22, HIGH);
}

void izquierda()
{
  digitalWrite(STBY, HIGH);
  analogWrite(PWM1, 255);
  analogWrite(PWM2, 255);
  digitalWrite(IN11, HIGH);
  digitalWrite(IN21, LOW);
  digitalWrite(IN12, HIGH);
  digitalWrite(IN22, LOW);
}

void detenerse()
{
  digitalWrite(STBY, LOW);
}

void servo()
{
  if (dato > 0)
  {
    var = dato * 9;
  }
  myservo.write(var);
}

void sen()
{
  unsigned long currentMillis = millis();
  if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OnTime1)) 
  {
    ledState1 = HIGH; // Cambia el valor de la variable para luego escribirla
    previousMillis1 = currentMillis; // "La ultima vez fue AHORA"
    int reading = analogRead(sensorPin);
    float voltage = reading * 5.0;
    voltage /= 1024.0;
    float temperatureC = (voltage - 0.5) * 100 ;
    Serial.print("Temperatura: ");
    Serial.print(temperatureC);
    Serial.println("°C");
    if (temperatureC >= 45) {
      if ((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2))
      {
        ledState2 = LOW;
        previousMillis2 = currentMillis;
        digitalWrite(luzsen, ledState2);
      }
      else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2)) 
      {
        ledState2 = HIGH; // Cambia el valor de la variable para luego escribirla
        previousMillis2 = currentMillis; // "La ultima vez fue AHORA"
        digitalWrite(luzsen, ledState2); // Hace efectivo el cambio en el LED
      }
    }
  }
  else if ((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OffTime1))
  {
    ledState1 = LOW;
    previousMillis1 = currentMillis;
  }

  if ((estado3 == HIGH) && (currentMillis - previousMillis3 >= OnTime3))
  {
    estado3 = LOW;
    previousMillis3 = currentMillis;
    pinMode(pin, OUTPUT); 
    digitalWrite(pin, LOW);
    delayMicroseconds(25);
    digitalWrite(pin, HIGH); 
    time = micros(); 
    pinMode(pin, INPUT); 
    sizeofpulse = pulseIn(pin, LOW, 18000); 
    time = micros() - time - sizeofpulse; 
    distance = (time * 340.29 / 2 / 10000) - 3; 
    Serial.print(" Distancia: ");
    Serial.print(distance);
    Serial.println(" cm");
  }
  else if ((estado3 == LOW) && (currentMillis - previousMillis3 >= OffTime3)) 
  {
    estado3 = HIGH;
    previousMillis3 = currentMillis; 
  }
}

Al final quedan 3 baterias, en este caso caso 2 de 9v para la alimentación de los motores y el arduino y otra de 3.7v para el servo motor.

Figura 1. Conexión completa del circuito

Figura 2. Bloques finales


Video del funcionamiento:



Comentarios

Entradas populares