{ROBÓTICA}

NIVEL 2

Prof. Daniel Tedesco

{CAPACITACIÓN DOCENTE}

{Sensores ultrasónicos}

{Sensor de ultrasonido, de proximidad HC-SR04}

{Sensor de ultrasonido, de proximidad HC-SR04}

Frecuencia: 40 kHz (oído humano 20 kHz)

Rango: 20 a 40 cm

HC-SR05

Mayor precisión, y hasta dos pines echo

1.

2.

SRF-05

Evolución de los anteriores con mayor precisión.

3.

US-100

Incorpora un modulo de compensación de la temperatura para generar datos aún más precisos

{Alternativas con más precisión}

{Cableado}

Ejercicio 1: Medición de distancia

{Código}

// C++ code
/*
	Primer programa que envía mediante el Monitor Serial el valor de distancia
	leído por el sensor ultrasónico HC-SR04.  
*/

int TRIG = 10;			// trigger en pin 10
int ECO = 9;			// echo en pin 9
int LED = 3;			// LED en pin 3
int DURACION;
int DISTANCIA;

void setup()
{
  pinMode(TRIG, OUTPUT); 	// trigger como salida
  pinMode(ECO, INPUT);		// echo como entrada
  pinMode(LED, OUTPUT);		// LED como salida
  Serial.begin(9600);  		// inicializacion de comunicacion serial a 9600 bps

}

void loop()
{
  
  digitalWrite(TRIG, HIGH); 		// generacion del pulso a enviar
  delay(1);				// al pin conectado al trigger
  digitalWrite(TRIG, LOW);		// del sensor
  
  DURACION = pulseIn(ECO, HIGH);	// con funcion pulseIn se espera un pulso
  					// alto en Echo
  DISTANCIA = DURACION / 58.2;		// distancia medida en centimetros
  Serial.println(DISTANCIA);		// envio de valor de distancia por monitor serial
  delay(200);				// demora entre datos

   
}

{Ejercicio 2: Medición de distancia y led}

{Código}

// C++ code
/*
	Capitulo 5 de Arduino desde cero en Español
	Segundo programa que envía mediante el Monitor Serial el valor de distancia
	leído por el sensor ultrasónico HC-SR04 y enciende y apaga LED dentro del
	rango de 0 a 20 cms.

	Autor: bitwiseAr  

*/

int TRIG = 10;			// trigger en pin 10
int ECO = 9;			// echo en pin 9
int LED = 3;			// LED en pin 3
int DURACION;
int DISTANCIA;

void setup()
{
  pinMode(TRIG, OUTPUT); 	// trigger como salida
  pinMode(ECO, INPUT);		// echo como entrada
  pinMode(LED, OUTPUT);		// LED como salida
  Serial.begin(9600);  		// inicializacion de comunicacion serial a 9600 bps

}

void loop()
{
  
  digitalWrite(TRIG, HIGH); 		// generacion del pulso a enviar
  delay(1);				// al pin conectado al trigger
  digitalWrite(TRIG, LOW);		// del sensor
  
  DURACION = pulseIn(ECO, HIGH);	// con funcion pulseIn se espera un pulso
  					// alto en Echo
  DISTANCIA = DURACION / 58.2;		// distancia medida en centimetros
  Serial.println(DISTANCIA);		// envio de valor de distancia por monitor serial
  delay(200);				// demora entre datos

  if (DISTANCIA <= 20 && DISTANCIA >= 0){	// si distancia entre 0 y 20 cms.
    digitalWrite(LED, HIGH);			// enciende LED
    delay(DISTANCIA * 10);			// demora proporcional a la distancia
    digitalWrite(LED, LOW);			// apaga LED
    }
   
}

{Ejercicio 3: Medición de distancia y buzzer}

{Código}

Ejercicio 4: 2da.prueba del sensor

{Código}

const int Trigger = 2;   //Pin digital 2 para el Trigger del sensor
const int Echo = 3;   //Pin digital 3 para el Echo del sensor

void setup() {
  Serial.begin(9600);//iniciailzamos la comunicación
  pinMode(Trigger, OUTPUT); //pin como salida
  pinMode(Echo, INPUT);  //pin como entrada
  digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
}

void loop()
{

  long t; //timepo que demora en llegar el eco
  long d; //distancia en centimetros

  digitalWrite(Trigger, HIGH);
  delayMicroseconds(10);          //Enviamos un pulso de 10us
  digitalWrite(Trigger, LOW);
  
  t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso
  d = t/59;             //escalamos el tiempo a una distancia en cm
  
  Serial.print("Distancia: ");
  Serial.print(d);      //Enviamos serialmente el valor de la distancia
  Serial.print("cm");
  Serial.println();
  delay(100);          //Hacemos una pausa de 100ms
}

{Ejercicio 5: Led RGB y sensor de proximidad}

{Código}

/*
  Vamos a configurar las diferentes salidas de nuestro arduino lograr 
  diferentes colores utilizando la tecnica de adición
*/

//INICIO VARIABLES

int disparo = 4;
int echo = 2;

int ledTest = 13;

int ledRojo = 11;
int ledVerde = 10;
int ledAzul = 9;
int intensidad = 0;

//Inicio variables temporales

long tiempoPulso;
long tVal;


void setup() {
  //INICIO SETUP ENTRADAS / SALIDAS

  pinMode(ledTest, OUTPUT);
  pinMode(disparo, OUTPUT);
  pinMode(echo, INPUT);

  digitalWrite(disparo, LOW);
  analogWrite(ledRojo, 0);
  analogWrite(ledVerde, 0);
  analogWrite(ledAzul, 0);

  //Saludo Inicial
  digitalWrite(ledTest, HIGH);
  delay(500);
  digitalWrite(ledTest, LOW);
  delay(500);
  digitalWrite(ledTest, HIGH);
  delay(500);
  digitalWrite(ledTest, LOW);
  delay(500);
  digitalWrite(ledTest, HIGH);
  delay(500);
  digitalWrite(ledTest, LOW);
  delay(500);
}


void loop() {
  //Disparo de la señal.

  digitalWrite(disparo, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  digitalWrite(disparo, LOW);

  /*INICIO
     Medimos la longitud del puso entrante la utilizamos para medir el tiempo que transcurrido entre el envío  del pulso ultrasónico y cuando el sensor recibe el rebote,
     es decir: desde que el pin "echo" empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante.
     El resultado lo da en microsegundos
  */

  tiempoPulso = pulseIn(echo, HIGH);

  /*INICIO
    Ahora dependiendo del tiempo del pulso vamos a utilizar los leds RGB para señalar si el objeto se encuentra cerca o lejos.
    Cuando el objeto se encuentre a menos de 10cm mostraremos una luz roja (550µs segun las pruegas en el capitulo anterior)
    Cuando esté entre 20cm y 15cm una luz amarilla (860µs segun las pruegas en el capitulo anterior)
    Cuando está a entre 15cm y 20cm la luz verde (1140µs segun las pruegas en el capitulo anterior)
    Cuando esté mas lejos luz blanca proporcional a la distancia
  */
  if (tiempoPulso < 550) {
    analogWrite(ledRojo, 255);
    analogWrite(ledVerde, 0);
    analogWrite(ledAzul, 0);
  }
  else if ( tiempoPulso >= 550 &&  tiempoPulso < 860 ) {
    analogWrite(ledRojo, 255);
    analogWrite(ledVerde, 255);
    analogWrite(ledAzul, 0);
  }
  else if (tiempoPulso >= 860 && tiempoPulso < 1140) {
    analogWrite(ledRojo, 0);
    analogWrite(ledVerde, 255);
    analogWrite(ledAzul, 0);
  }
  else { 
    tVal = constrain(tiempoPulso, 1140, 5700); /* Constrain limita el valor obtenido en la variable (el primer parametro) a un valor entre 
                                               el 2° parametro (limite inferior, 1140 en este caso) y el 3° parametro (limite superiro 5700).
                                              Funciona de la siguiente forma:
                                              si tiempoPulso esta entre los limites, devuelve el mismo valor de tiempoPulso, 
                                              si es menor al limite inferior, reemplaza tiempoPulso por el limite inferior (1140 en este caso)
                                              si es superior al limite superior, reemplaza el valor de tiempoPulso por el limite superior (5700) */
    
    
    intensidad = map(tVal, 1140, 5700, 0, 255);  /*  map(X, inMin,inMax,outMin,outMax)   transforma el valor obtenido antes (tval), que 
                                              estaba entre 1140 y 5700 a un nuevo valor proporcional pero entre 0 y 255 que son los que
                                              puede utilizar analogWrite en los pines.*/   
    

    analogWrite(ledRojo, intensidad);          
    analogWrite(ledVerde, intensidad);
    analogWrite(ledAzul, intensidad);
  }

}

{Servomotores}

{Servomotores}

Un servomotor es un motor eléctrico, con regulación en voltaje y reductores de engranajes, tanto plásticos como mecánicos. Tiene la particularidad de ser controlado, tanto en velocidad como en posición.

{Servomotor SG-90}

Es un servo con caja reductora de engranajes de nylon y posee un giro programable de hasta 180 grados, con un torque de 1.4 kg

Es un servo con caja reductora de engranajes de metal y posee un giro programable de hasta 180 grados. Aumenta su torque de 1.8 a 2.2 Kg

{Servomotor MG-60}

{Servomotor MG-996r}

Es un servo con caja reductora de engranajes de metal y posee un giro programable de hasta 360 grados (con código especial), con un torque de 11 kg

{Cableado}

{Composición de un servo}

{Ejercicio 5 - Prueba servomotor}

{Código 1 - Movimiento cada 5"}

// C++ code
/*
	Programa que mueve el servomotor de 0 a 180 grados cada cinco segundos y
	se usa para determinar el valor practico del pulso minimo y maximo.  
*/

#include <Servo.h>  		// incluye libreria de Servo

Servo servo1;			// crea objeto

int PINSERVO = 2;		// pin 2 conectado a señal del servo
int PULSOMIN = 1000;		// pulso minimo en microsegundos
int PULSOMAX = 2000;		// pulso maximo en microsegundos


void setup()
{
  servo1.attach(PINSERVO, PULSOMIN, PULSOMAX);	// inicializacion de servo
}

void loop()
{
  servo1.write(0);		// ubica el servo a 0 grados
  delay(5000); 			// espera de 5 seg.
  servo1.write(180);		// ubica el servo a 180 grados
  delay(5000);			// espera de 5 seg.
}

{Código 2-Réplica del potenciómetro}

// C++ code
/*
	Capitulo 6 de Arduino desde cero en Español
	Segundo programa que lee el valor del potenciometro conectado a entrada A0
	y lo convierte a valor de angulo para mover al servo hacia el mismo.  

*/

#include <Servo.h>  		// incluye libreria de Servo

Servo servo1;			// crea objeto

int PINSERVO = 2;		// pin 2 conectado a señal del servo
int PULSOMIN = 1000;		// pulso minimo en microsegundos
int PULSOMAX = 2000;		// pulso maximo en microsegundos
int VALORPOT;			// variable para almacenar valor leido en entrada A0
int ANGULO;			// valor de angulo a cargar en el servo

int POT = 0;			// potenciometro en entrada analogica A0

void setup()
{
  servo1.attach(PINSERVO, PULSOMIN, PULSOMAX);	// inicializacion de servo
// las entradas analogicas no requieren inicializacion
}

void loop()
{
  VALORPOT = analogRead(POT);			// lee valor de entrada A0
  ANGULO = map(VALORPOT, 0, 1023, 0, 180);	// con funcion map convierte rango de 0 a 1023
						// a rango de angulo de 0 a 180
  servo1.write(ANGULO);				// envia al servo el valor del angulo
  delay(20);					// demora para que el servo llegue a posicion
}

{Robot

de la mantequilla}

Rick & Morty

{Modelo 3D}

Descargá el modelo 3D

para imprimir aquí

{Diagrama}

{Código}

#include <Servo.h>
#define pin_servo 2
#define ledrojo 4
#define trigPin 13
#define echoPin 12
#define buzzer 9
#define frecuencia 1000
long duration;
long distance;
Servo myservo;

void setup()
{
  pinMode (pin_servo, OUTPUT);
  pinMode (ledrojo, OUTPUT);
  pinMode (trigPin, OUTPUT);
  pinMode (echoPin, INPUT);
  pinMode (buzzer, OUTPUT);
  myservo.attach(pin_servo);
}

void loop()
{
digitalWrite(trigPin, LOW);
  delay (0.002);
  digitalWrite(trigPin, HIGH);
  delay (0.01);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin,HIGH);
  distance = (duration / 2) / 29.1;
  if (distance <= 50) 
{
    
    digitalWrite(ledrojo,HIGH);
    tone(buzzer,frecuencia);
    delay (1000);
    noTone(buzzer);
    myservo.write(180);
    delay(15);
}
  else
{
    digitalWrite(ledrojo,LOW);
    myservo.write(0);
   }
    }

{Circuito alternativo}

{Código alternativo}


// SERVO //
#include <Servo.h>

Servo myservo;
Servo myservo2;

// POSICION //
#include "SHCSR04.h"

float distancia = 0;

SHCSR04 hcsr04;

void setup() {
  // Servo
  myservo.attach(9);
  myservo2.attach(10);
  // Serial
  Serial.begin(115200);

}

void loop() {
  distancia = hcsr04.read(4, 5);
  Serial.println(distancia);
  delay(100);

  if (distancia < 5) {
    myservo.write(50);
    myservo2.write(10);
    delay(500);
  } else {
    myservo.write(10);
    myservo2.write(50);
    delay(500);
  }

}

{Lampara litofanía}

 

{Modelo 3D}

Descargá el modelo 3D de la base aquí

Diseñá tus litofanías aquí: https://3dp.rocks/lithophane/

{Diagrama}

{Código}

/*
  Vamos a configurar las diferentes salidas de nuestro arduino lograr 
  diferentes colores utilizando la tecnica de adición
*/

//INICIO VARIABLES

int disparo = 4;
int echo = 2;

int ledTest = 13;

int ledRojo = 11;
int ledVerde = 10;
int ledAzul = 9;
int intensidad = 0;

//Inicio variables temporales

long tiempoPulso;
long tVal;


void setup() {
  //INICIO SETUP ENTRADAS / SALIDAS

  pinMode(ledTest, OUTPUT);
  pinMode(disparo, OUTPUT);
  pinMode(echo, INPUT);

  digitalWrite(disparo, LOW);
  analogWrite(ledRojo, 0);
  analogWrite(ledVerde, 0);
  analogWrite(ledAzul, 0);

  //Saludo Inicial
  digitalWrite(ledTest, HIGH);
  delay(500);
  digitalWrite(ledTest, LOW);
  delay(500);
  digitalWrite(ledTest, HIGH);
  delay(500);
  digitalWrite(ledTest, LOW);
  delay(500);
  digitalWrite(ledTest, HIGH);
  delay(500);
  digitalWrite(ledTest, LOW);
  delay(500);
}


void loop() {
  //Disparo de la señal.

  digitalWrite(disparo, HIGH); /* envío del pulso ultrasónico*/
  delayMicroseconds(10);
  digitalWrite(disparo, LOW);

  /*INICIO
     Medimos la longitud del puso entrante la utilizamos para medir el tiempo que transcurrido entre el envío  del pulso ultrasónico y cuando el sensor recibe el rebote,
     es decir: desde que el pin "echo" empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante.
     El resultado lo da en microsegundos
  */

  tiempoPulso = pulseIn(echo, HIGH);

  /*INICIO
    Ahora dependiendo del tiempo del pulso vamos a utilizar los leds RGB para señalar si el objeto se encuentra cerca o lejos.
    Cuando el objeto se encuentre a menos de 10cm mostraremos una luz roja (550µs segun las pruegas en el capitulo anterior)
    Cuando esté entre 20cm y 15cm una luz amarilla (860µs segun las pruegas en el capitulo anterior)
    Cuando está a entre 15cm y 20cm la luz verde (1140µs segun las pruegas en el capitulo anterior)
    Cuando esté mas lejos luz blanca proporcional a la distancia
  */
  if (tiempoPulso < 550) {
    analogWrite(ledRojo, 255);
    analogWrite(ledVerde, 0);
    analogWrite(ledAzul, 0);
  }
  else if ( tiempoPulso >= 550 &&  tiempoPulso < 860 ) {
    analogWrite(ledRojo, 255);
    analogWrite(ledVerde, 255);
    analogWrite(ledAzul, 0);
  }
  else if (tiempoPulso >= 860 && tiempoPulso < 1140) {
    analogWrite(ledRojo, 0);
    analogWrite(ledVerde, 255);
    analogWrite(ledAzul, 0);
  }
  else { 
    tVal = constrain(tiempoPulso, 1140, 5700); /* Constrain limita el valor obtenido en la variable (el primer parametro) a un valor entre 
                                               el 2° parametro (limite inferior, 1140 en este caso) y el 3° parametro (limite superiro 5700).
                                              Funciona de la siguiente forma:
                                              si tiempoPulso esta entre los limites, devuelve el mismo valor de tiempoPulso, 
                                              si es menor al limite inferior, reemplaza tiempoPulso por el limite inferior (1140 en este caso)
                                              si es superior al limite superior, reemplaza el valor de tiempoPulso por el limite superior (5700) */
    
    
    intensidad = map(tVal, 1140, 5700, 0, 255);  /*  map(X, inMin,inMax,outMin,outMax)   transforma el valor obtenido antes (tval), que 
                                              estaba entre 1140 y 5700 a un nuevo valor proporcional pero entre 0 y 255 que son los que
                                              puede utilizar analogWrite en los pines.*/   
    

    analogWrite(ledRojo, intensidad);          
    analogWrite(ledVerde, intensidad);
    analogWrite(ledAzul, intensidad);
  }

}

{Tacho automático}

 

{Ejemplo - Tacho de basura}

{Ejercicio  - Tacho de basura Diagrama}

{Código - Tacho de basura


#include <Servo.h>   //servo library
Servo servo;     
int trigPin = 5;    
int echoPin = 6;   
int servoPin = 7;
int led= 10;
long duration, dist, average;   
long aver[3];   //array for average


void setup() {       
    Serial.begin(9600);
    servo.attach(servoPin);  
    pinMode(trigPin, OUTPUT);  
    pinMode(echoPin, INPUT);  
    servo.write(0);         //close cap on power on
    delay(100);
    servo.detach(); 
} 

void measure() {  
 digitalWrite(10,HIGH);
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
dist = (duration/2) / 29.1;    //obtain distance
}
void loop() { 
  for (int i=0;i<=2;i++) {   //average distance
    measure();               
   aver[i]=dist;            
    delay(10);              //delay between measurements
  }
 dist=(aver[0]+aver[1]+aver[2])/3;    

if ( dist<50 ) {
//Change distance as per your need
 servo.attach(servoPin);
  delay(1);
 servo.write(0);  
 delay(3000);       
 servo.write(150);    
 delay(1000);
 servo.detach();      
}
Serial.print(dist);
}

{Estación meteorológica}

 

{Diagrama}

{código}

#include <LiquidCrystal.h>
int rs = 12;
int e = 11;
int d4 = 5;
int d5 = 4;

int dTime = 500;
//LCD

int d6 = 3;
int d7 = 2;
int numero = 0;

LiquidCrystal lcd(rs, e, d4, d5, d6, d7);

//DHT11

#include <DHT.h>
#include <DHT_U.h>

#define Type DHT11
int dhtPin = 8;
DHT HT(dhtPin, Type);
int humidity;
float tempC;
float tempF;


void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  Serial.begin(9600);
  HT.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  humidity = HT.readHumidity();
  tempC = HT.readTemperature();
  //tempF = HT.readTemperature(true);
  Serial.print("Humedad Relativa: ");
  Serial.print(humidity);
  Serial.print("% / Temperatura: ");
  Serial.print(tempC);
  Serial.print("ºC / ");
  Serial.print(tempF);
  Serial.println("ºF");


  lcd.setCursor(0, 0);
  lcd.print("Humedad: ");
  lcd.print(humidity);
  lcd.print("%");

  lcd.setCursor(0, 1);
  lcd.print("Temp.: ");
  lcd.print(tempC);
  lcd.print("*C");

  delay(dTime);
  lcd.clear();
}

{Estación meteorológica}

IOT

 

 

La definición de IoT podría ser la agrupación e interconexión de dispositivos y objetos a través de una red (bien sea privada o Internet, la red de redes), dónde todos ellos podrían ser visibles e interaccionar. Respecto al tipo de objetos o dispositivos podrían ser cualquiera, desde sensores y dispositivos mecánicos hasta objetos cotidianos como pueden ser el frigorífico, el calzado o la ropa. Cualquier cosa que se pueda imaginar podría ser conectada a internet e interaccionar sin necesidad de la intervención humana, el objetivo por tanto es una interacción de máquina a máquina, o lo que se conoce como una interacción M2M (machine to machine) o dispositivos M2M.

{¿Qué es IOT?}

{¿Qué es IOT?}

{¿Qué es la placa ESP 8266?}

Es una placa de desarrollo con conectividad Wi-Fi y Bluetooth.

Posee una serie de pines digitales, llamados GPIO, a través de los cuales se pueden vincular sensores -actuadores con dashboards de datos e IOT

{¿Cómo controlar la ESP 8266 desde el IDE de Arduino?}

{Diagrama}

{Código}

#include <SimpleDHT.h>                   // Data ---> D3 VCC ---> 3V3 GND ---> GND --->Pines de conexión
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
// WiFi parameters
#define WLAN_SSID       "Speedy-Fibra-"// coneccción del SSID de wi fi (preferentemente 2.4 Ghz)
#define WLAN_PASS       "Kaball0_L0c0" // Incluír la clave de wi fi
// Adafruit IO
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "profdanieltedesco" // usuario de Adafruit
#define AIO_KEY         "aio_umyQ26M2YPO3Zw2xafOB0P5Nl5B8" //Llave de Adafruit
WiFiClient client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish temperatura = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperatura"); //Colocar el feed de temperatura
Adafruit_MQTT_Publish humedad = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humedad"); // Colocar el feed de humedad

int pinDHT11 = 0;
SimpleDHT11 dht11(pinDHT11);
byte hum = 0;  //Stores humidity value
byte temp = 0; //Stores temperature value
void setup() {
  Serial.begin(115200);
  Serial.println(F("Adafruit IO Example"));
  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  delay(10);
  Serial.print(F("Connecting to "));
  Serial.println(WLAN_SSID);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.println();
  Serial.println(F("WiFi connected"));
  Serial.println(F("IP address: "));
  Serial.println(WiFi.localIP());

  // connect to adafruit io
  connect();

}

// connect to adafruit io via MQTT
void connect() {
  Serial.print(F("Connecting to Adafruit IO... "));
  int8_t ret;
  while ((ret = mqtt.connect()) != 0) {
    switch (ret) {
      case 1: Serial.println(F("Wrong protocol")); break;
      case 2: Serial.println(F("ID rejected")); break;
      case 3: Serial.println(F("Server unavail")); break;
      case 4: Serial.println(F("Bad user/pass")); break;
      case 5: Serial.println(F("Not authed")); break;
      case 6: Serial.println(F("Failed to subscribe")); break;
      default: Serial.println(F("Connection failed")); break;
    }

    if(ret >= 0)
      mqtt.disconnect();

    Serial.println(F("Retrying connection..."));
    delay(10000);
  }
  Serial.println(F("Adafruit IO Connected!"));
}

void loop() {
  // ping adafruit io a few times to make sure we remain connected
  if(! mqtt.ping(3)) {
    // reconnect to adafruit io
    if(! mqtt.connected())
      connect();
  }
  dht11.read(&temp, &hum, NULL);
  Serial.print((int)temp); Serial.print(" *C, "); 
  Serial.print((int)hum); Serial.println(" H");
  delay(5000);
   
   if (! temperatura.publish(temp)) {                     //Publish to Adafruit
      Serial.println(F("Failed"));
    } 
       if (! humedad.publish(hum)) {                     //Publish to Adafruit
      Serial.println(F("Failed"));
    }
    else {
      Serial.println(F("Sent!"));
    }
}

{Sensor de humedad de suelo}

 

{Diagrama}

 

{Código}

#define sensor A0 
int valor = 0;

void setup()
{
    Serial.begin(9600);
}
void loop()
{
    int valor = map(analogRead(sensor), 0, 1023, 100, 0);
    //se hace un mapeo de la lectura del sensor a porcentual
    Serial.print("Humedad: ");
    Serial.print(valor);
    Serial.println("%");
    delay(100);
}

{Calculadora Arduino}

 

{Diagrama}

{code}

/**
   Arduino Calculator

*/

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

/* Display */
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
  {'1', '2', '3', '+'},
  {'4', '5', '6', '-'},
  {'7', '8', '9', '*'},
  {'.', '0', '=', '/'}
};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);

uint64_t value = 0;

void showSpalshScreen() {
  lcd.print("GoodArduinoCode");
  lcd.setCursor(3, 1);
  String message = "Calculator";
  for (byte i = 0; i < message.length(); i++) {
    lcd.print(message[i]);
    delay(50);
  }
  delay(500);
}

void updateCursor() {
  if (millis() / 250 % 2 == 0 ) {
    lcd.cursor();
  } else {
    lcd.noCursor();
  }
}

void setup() {
  Serial.begin(115200);
  lcd.begin(16, 2);

  showSpalshScreen();
  lcd.clear();
  lcd.cursor();

  lcd.setCursor(1, 0);
}

char operation = 0;
String memory = "";
String current = "";
uint64_t currentDecimal;
bool decimalPoint = false;

double calculate(char operation, double left, double right) {
  switch (operation) {
    case '+': return left + right;
    case '-': return left - right;
    case '*': return left * right;
    case '/': return left / right;
  }
}

void processInput(char key) {
  if ('-' == key && current == "") {
    current = "-";
    lcd.print("-");
    return;
  }

  switch (key) {
    case '+':
    case '-':
    case '*':
    case '/':
      if (!operation) {
        memory = current;
        current = "";
      }
      operation = key;
      lcd.setCursor(0, 1);
      lcd.print(key);
      lcd.setCursor(current.length() + 1, 1);
      return;

    case '=':
      float leftNum = memory.toDouble();
      float rightNum = current.toDouble();
      memory = String(calculate(operation, leftNum, rightNum));
      current = "";
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print(memory);
      lcd.setCursor(0, 1);
      lcd.print(operation);
      return;

  }

  if ('.' == key && current.indexOf('.') >= 0) {
    return;
  }

  if ('.' != key && current == "0") {
    current = String(key);
  } else if (key) {
    current += String(key);
  }

  lcd.print(key);
}

void loop() {
  updateCursor();

  char key = keypad.getKey();
  if (key) {
    processInput(key);
  }
}

DOCENTES II - Capacitación

By profdanieltedesco

DOCENTES II - Capacitación

  • 79