Arduino (IoT): Simple Tutorial para Medir Voltaje con Arduino

Voltmeter Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial de Medición de Voltaje

En este tutorial usamos una Arduino para medir voltaje.

Requisitos:

  1. Computadora (mac)
  2. Arduino Nano
  3. LCD 16×02
  4. Potenciometro
  5. Breadboard
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)
Simple Tutorial Medicion Voltaje Arduino Santiapps Marcio Valenzuela
Simple Tutorial Medicion Voltaje Arduino

El código incorpora lo que vimos para mostrar información en una pantalla LCD 16×2 y el uso de resistencias para dividir el voltaje a ser medido para que la Arduino no se dañe.  El código es así:

[code]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pines de data de LCD
float vin=0.0;
float temp=0.0;
float r1=100000.0; // Resistor 1
float r2=10000.0; // Resistor 2
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // Cols y filas del lcd
lcd.print(“Santiapps”); // Imprimir saludo.
delay(1000);
lcd.clear();
lcd.print(“DC Voltimetro”);
}
void loop() {
int analog_val=analogRead(A0); // leer pin analogo A0
temp = (analog_val * 5.0)/1024.0; // Si se mide hasta 5V
vin = temp/(r2/(r1+r2));
if(vin<0.1){
vin=0.0;
}
lcd.setCursor(0, 1); // Col 0, fila 1
lcd.print(“Voltage = “); // Mostrar voltaje
lcd.println(vin);
delay(300);
}
[/code]

Las conexiones son asi:

Simple Tutorial Medicion Voltaje Arduino Santiapps Marcio Valenzuela
Simple Tutorial Medicion Voltaje Arduino

Esto es muy útil cuando tenemos proyectos conectados a baterías y queremos monitorear el nivel de carga.

Arduino (IoT): Simple Tutorial GPS Top Titan 3 Glonass: Parte 2

GPS Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial GPS Top Titan 3: Parte 2

En este tutorial recibiremos datos de un modulo GPS usando la library TinyGPS.

Requisitos:

  1. Computadora (mac)
  2. Arduino MEGA
  3. Modulo Top Titan 3 GPS/Glonass
  4. Breadboard
  5. Arduino IDE (https://www.arduino.cc/en/Main/Software)
Arduino IoT: Simple Tutorial GPS Titan3 Santiapps Marcio Valenzuela
Arduino IoT: Simple Tutorial GPS Titan3

La conexión:

  • GPS Pin 4 : 10 de la MEGA
  • GPS Pin 3 : 11 de la MEGA
  • GPS Pin 2 : GROUND de la MEGA
  • GPS Pin 1 : 3.3V de la MEGA

Ya conectado se mira asi:

Arduino IoT: Simple Tutorial GPS Titan3 Santiapps Marcio Valenzuela
Arduino IoT: Simple Tutorial GPS Titan3

El código viene de una muestra en la TinyGPS llamada test_with_gps_device que se puede encontrar en File > Examples > TinyGPS > Examples > test_with_ps_device.:

[code]
#include <SoftwareSerial.h>
#include <TinyGPS.h>
TinyGPS gps;
SoftwareSerial ss(10,11); //Rx from
static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
void setup(){
Serial.begin(9600);
Serial.print(“Testing TinyGPS library v. “); Serial.println(TinyGPS::library_version());
Serial.println(“by Mikal Hart”);
Serial.println();
Serial.println(“Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum”);
Serial.println(” (deg) (deg) Age Age (m) — from GPS —- —- to London —- RX RX Fail”);
Serial.println(“————————————————————————————————————————————-“);
ss.begin(9600);
}
void loop(){
float flat, flon;
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
gps.f_get_position(&flat, &flon, &age);
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
print_date(gps);
print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? “*** ” : TinyGPS::cardinal(gps.f_course()), 6);
print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? “*** ” : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);
gps.stats(&chars, &sentences, &failed);
print_int(chars, 0xFFFFFFFF, 6);
print_int(sentences, 0xFFFFFFFF, 10);
print_int(failed, 0xFFFFFFFF, 9);
Serial.println();
smartdelay(1000);
}
static void smartdelay(unsigned long ms){
unsigned long start = millis();
do {
while (ss.available())
gps.encode(ss.read());
} while (millis() – start < ms);
}
static void print_float(float val, float invalid, int len, int prec){
if (val == invalid){
while (len– > 1)
Serial.print(‘*’);
Serial.print(‘ ‘);
}else{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and –
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(‘ ‘);
}
smartdelay(0);
}
static void print_int(unsigned long val, unsigned long invalid, int len){
char sz[32];
if (val == invalid)
strcpy(sz, “*******”);
else
sprintf(sz, “%ld”, val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ‘ ‘;
if (len > 0)
sz[len-1] = ‘ ‘;
Serial.print(sz);
smartdelay(0);
}
static void print_date(TinyGPS &gps){
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long age;
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
if (age == TinyGPS::GPS_INVALID_AGE)
Serial.print(“********** ******** “);
else{
char sz[32];
sprintf(sz, “%02d/%02d/%02d %02d:%02d:%02d “,
month, day, year, hour, minute, second);
Serial.print(sz);
}
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
smartdelay(0);
}
static void print_str(const char *str, int len){
int slen = strlen(str);
for (int i=0; i<len; ++i)
Serial.print(i<slen ? str[i] : ‘ ‘);
smartdelay(0);
}[/code]

 

En el monitor serial saldrá algo así:

Arduino (IoT): Simple Tutorial GPS Glonass Titan 3 Santiapps Marcio Valenzuela
Arduino (IoT): Simple Tutorial GPS Glonass Titan 3

Esta es la misma informacion pero digerida o ‘parseada’ de cierta forma para ser mas legible.  Esto también se puede enviar a un servicio web para ‘plotear’ en un mapa o en una computadora con windows se puede usar esta aplicación para ver la data:

Este modulo GPS tiene grandes aplicaciones como rastrear vehículos, bienes de mucho valor, monitorear comportamiento de fauna o incluso programar Arduino Drones a volar de cierta ubicación a cierta otra ubicación!


	

Arduino (IoT): Simple Tutorial Medición de Corriente Sleep Mode AVR

AVR Sleep Mode Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Medición de Corriente Sleep Mode AVR

En  un tutorial anterior vimos como medir la corriente consumida por la MCU.  El mismo método puede ser utilizado para medir el consumo de corriente de un proyecto completo, al insertar el medidor entre la fuente de poder.  Antes de llegar a ese ejemplo, el cual nos ayudara a medir el consumo energético de un proyecto para poder hacer cálculos de autonomía (por ejemplo cuanta energía tendríamos que producir y almacenar para un proyecto solar por ejemplo), vamos a ver como podemos ahorrar energía poniendo nuestra Arduino a dormir.

Requisitos:

  1. Computadora (mac)
  2. Arduino UNO
  3. Medidor de Voltaje/Corriente
  4. Battery Pack
  5. Breadboard
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)

El proyecto de nuestra Arduino es asi:


Esta vez cargaremos un sketch asi:


#include <avr/sleep.h>
int wakePin = 2; // pin used for waking up
int sleepStatus = 0; // variable to store a request for sleep
int count = 0; // counter
void wakeUpNow() // here the interrupt is handled after wakeup{
}
void setup(){
pinMode(wakePin, INPUT);
Serial.begin(9600);
attachInterrupt(0, wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
}
void sleepNow() // here we put the arduino to sleep{
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register
// so sleep is possible. just a safety pin
attachInterrupt(0,wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
// wakeUpNow when pin 2 gets LOW
sleep_mode(); // here the device is actually put to sleep!!
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep:
// disable sleep...
detachInterrupt(0); // disables interrupt 0 on pin 2 so the
// wakeUpNow code will not be executed
// during normal running time.
}
void loop(){
// display information about the counter
Serial.print("Awake for ");
Serial.print(count);
Serial.println("sec");
count++;
delay(1000); // waits for a second
// compute the serial input
if (Serial.available()) {
int val = Serial.read();
if (val == 'S') {
Serial.println("Serial: Entering Sleep mode");
delay(100); // this delay is needed, the sleep
//function will provoke a Serial error otherwise!!
count = 0;
sleepNow(); // sleep function called here
}
if (val == 'A') {
Serial.println("Hola Caracola"); // classic dummy message
}
}
// check if it should go to sleep because of time
if (count >= 10) {
Serial.println("Timer: Entering Sleep mode");
delay(100); // this delay is needed, the sleep
//function will provoke a Serial error otherwise!!
count = 0;
sleepNow(); // sleep function called here
}
}

El código produce este resultado en el Serial Monitor:

Arduino IoT Simple Tutorial Medicion de Corriente AVR Sleep Mode by Santiapps Marcio Valenzuela
Arduino IoT Simple Tutorial Medicion de Corriente AVR Sleep Mode

Como podemos ver el codigo hace que la Arduino duerma luego de 10 segundos.  Es importante entender esto para que a la hora de medir la corriente sepamos que el consumo deberá bajar luego de 10 segundos para ver el ahorro.

Este código esta tomado del sitio Arduino.cc y es importante usar el Resistor 220Ohms entre el pin2 y el pin0(Rx). Subamos el código a la Arduino y luego hagamos las conexiones como hicimos anteriormente para medir la corriente.  La idea es medir la corriente mientras la Arduino esta despierta vs cuando esta dormida.

El resultado final esta aqui, sin embargo es igual a la anterior:


Pero luego de 10 segundos:


Como vemos el consumo baja de 46.5mA a 33.3mA.  Esto representa un ahorro del 28%.

Ahora veámoslos en la Nano: