Santiapps = ArduinoHonduras

ArduinoHonduras is now Santiapps. In order to provide our readers with a unified experience, Facebook.com/ArduinoHonduras has been rebranded as Santiapps. Santiapps.com is the content producer for more than +120 Arduino, Raspberry Pi, iOS and Android Programming Tutorials in Spanish and English.

We are moving to developing final products developed by ourselves and our users as well as improving of tutorials by moving over to a video format which is better suited for our needs.

We hope you enjoy the new .com/Facebook/YouTube experience.

Ahora ArduinoHonduras es Santiapps. Para dar a nuestros lectores una experiencia más unificada, Facebook.com/ArduinoHonduras ha sido renombrada Santiapps. Santiapps.com es el generador de contenido para más de +120 Tutoriales de Arduino, Raspberry Pi, iOS y Android en Inglés y Español.

Estamos pasando a producir dispositivos desarrollados por nosotros y por nuestros usuarios así como también migraremos a Tutoriales en formato video lo cual se presta mejor a nuestras necesidades.

Esperamos disfruten de la nueva experiencia .com/Facebook/YouTube.

Arduino (IoT): Simple Tutorial TFT Pantalla 1.8″ Parte I

TFT Display Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial TFT 1.8″ Parte I

Ver graficas y escribir o dibujar en una pantalla tft.

Requisitos:

  1. Computadora (mac)
  2. Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry…  Este tutorial en particular usa una Arduino UNO.
  3. MicroSD
  4. 1.8″ TFT
  5. Breadboard
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)

El código lo bajamos aquí:

Documents/Arduino/Adafruit-ST7735-Library-Master

Las conexiones son:

Shield——————–UNO

SCK – 13

DI –

DO – 11

TCS – 10

Reset(9) – 9

DC – 8

Es importante set los pines en codigo correctamente:

[code]
/***************************************************
ADAFRUIT
****************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8″ TFT shield
#define TFT_CS 10
#define TFT_RST 9 // you can also connect this to the Arduino reset
// in which case, set this #define pin to 0!
#define TFT_DC 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
float p = 3.1415926;
void setup(void) {
Serial.begin(9600);
Serial.print(“Hello! ST7735 TFT Test”);
// Use this initializer if you’re using a 1.8″ TFT
tft.initR(INITR_GREENTAB); // initialize a ST7735S chip, green tab
// Use this initializer (uncomment) if you’re using a 1.44″ TFT
//tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, black tab
Serial.println(“Initialized”);
uint16_t time = millis();
tft.fillScreen(ST7735_BLACK);
time = millis() – time;
Serial.println(time, DEC);
delay(500);
// large block of text
tft.fillScreen(ST7735_BLACK);
testdrawtext(“ArduinoHonduras tiene todo el Arduino que necesito! “, ST7735_WHITE);
delay(1000);
// tft print function!
tftPrintTest();
delay(4000);
// a single pixel
tft.drawPixel(tft.width()/2, tft.height()/2, ST7735_GREEN);
delay(500);
// line draw test
testlines(ST7735_YELLOW);
delay(500);
// optimized lines
testfastlines(ST7735_RED, ST7735_BLUE);
delay(500);
testdrawrects(ST7735_GREEN);
delay(500);
testfillrects(ST7735_YELLOW, ST7735_MAGENTA);
delay(500);
tft.fillScreen(ST7735_BLACK);
testfillcircles(10, ST7735_BLUE);
testdrawcircles(10, ST7735_WHITE);
delay(500);
testroundrects();
delay(500);
testtriangles();
delay(500);
mediabuttons();
delay(500);
Serial.println(“done”);
delay(1000);
}
void loop() {
tft.invertDisplay(true);
delay(500);
tft.invertDisplay(false);
delay(500);
}
void testlines(uint16_t color) {
tft.fillScreen(ST7735_BLACK);
for (int16_t x=0; x &lt; tft.width(); x+=6) {
tft.drawLine(0, 0, x, tft.height()-1, color);
}
for (int16_t y=0; y &lt; tft.height(); y+=6) {
tft.drawLine(0, 0, tft.width()-1, y, color);
}
tft.fillScreen(ST7735_BLACK);
for (int16_t x=0; x &lt; tft.width(); x+=6) {
tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
}
for (int16_t y=0; y &lt; tft.height(); y+=6) {
tft.drawLine(tft.width()-1, 0, 0, y, color);
}
tft.fillScreen(ST7735_BLACK);
for (int16_t x=0; x &lt; tft.width(); x+=6) {
tft.drawLine(0, tft.height()-1, x, 0, color);
}
for (int16_t y=0; y &lt; tft.height(); y+=6) {
tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
}
tft.fillScreen(ST7735_BLACK);
for (int16_t x=0; x &lt; tft.width(); x+=6) {
tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
}
for (int16_t y=0; y &lt; tft.height(); y+=6) {
tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
}
}
void testdrawtext(char *text, uint16_t color) {
tft.setCursor(0, 0);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void testfastlines(uint16_t color1, uint16_t color2) {
tft.fillScreen(ST7735_BLACK);
for (int16_t y=0; y &lt; tft.height(); y+=5) {
tft.drawFastHLine(0, y, tft.width(), color1);
}
for (int16_t x=0; x &lt; tft.width(); x+=5) {
tft.drawFastVLine(x, 0, tft.height(), color2);
}
}
void testdrawrects(uint16_t color) {
tft.fillScreen(ST7735_BLACK);
for (int16_t x=0; x &lt; tft.width(); x+=6) {
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
}
}
void testfillrects(uint16_t color1, uint16_t color2) {
tft.fillScreen(ST7735_BLACK);
for (int16_t x=tft.width()-1; x &gt; 6; x-=6) {
tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
}
}
void testfillcircles(uint8_t radius, uint16_t color) {
for (int16_t x=radius; x &lt; tft.width(); x+=radius*2) {
for (int16_t y=radius; y &lt; tft.height(); y+=radius*2) {
tft.fillCircle(x, y, radius, color);
}
}
}
void testdrawcircles(uint8_t radius, uint16_t color) {
for (int16_t x=0; x &lt; tft.width()+radius; x+=radius*2) {
for (int16_t y=0; y &lt; tft.height()+radius; y+=radius*2) {
tft.drawCircle(x, y, radius, color);
}
}
}
void testtriangles() {
tft.fillScreen(ST7735_BLACK);
int color = 0xF800;
int t;
int w = tft.width()/2;
int x = tft.height()-1;
int y = 0;
int z = tft.width();
for(t = 0 ; t &lt;= 15; t+=1) {
tft.drawTriangle(w, y, y, x, z, x, color);
x-=4;
y+=4;
z-=4;
color+=100;
}
}
void testroundrects() {
tft.fillScreen(ST7735_BLACK);
int color = 100;
int i;
int t;
for(t = 0 ; t &lt;= 4; t+=1) {
int x = 0;
int y = 0;
int w = tft.width()-2;
int h = tft.height()-2;
for(i = 0 ; i &lt;= 16; i+=1) {
tft.drawRoundRect(x, y, w, h, 5, color);
x+=2;
y+=3;
w-=4;
h-=6;
color+=1100;
}
color+=100;
}
}
void tftPrintTest() {
tft.setTextWrap(false);
tft.fillScreen(ST7735_BLACK);
tft.setCursor(0, 30);
tft.setTextColor(ST7735_RED);
tft.setTextSize(1);
tft.println(“Hello World!”);
tft.setTextColor(ST7735_YELLOW);
tft.setTextSize(2);
tft.println(“Hello World!”);
tft.setTextColor(ST7735_GREEN);
tft.setTextSize(3);
tft.println(“Hello World!”);
tft.setTextColor(ST7735_BLUE);
tft.setTextSize(4);
tft.print(1234.567);
delay(1500);
tft.setCursor(0, 0);
tft.fillScreen(ST7735_BLACK);
tft.setTextColor(ST7735_WHITE);
tft.setTextSize(0);
tft.println(“Hello World!”);
tft.setTextSize(1);
tft.setTextColor(ST7735_GREEN);
tft.print(p, 6);
tft.println(” Want pi?”);
tft.println(” “);
tft.print(8675309, HEX); // print 8,675,309 out in HEX!
tft.println(” Print HEX!”);
tft.println(” “);
tft.setTextColor(ST7735_WHITE);
tft.println(“Sketch has been”);
tft.println(“running for: “);
tft.setTextColor(ST7735_MAGENTA);
tft.print(millis() / 1000);
tft.setTextColor(ST7735_WHITE);
tft.print(” seconds.”);
}
void mediabuttons() {
// play
tft.fillScreen(ST7735_BLACK);
tft.fillRoundRect(25, 10, 78, 60, 8, ST7735_WHITE);
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_RED);
delay(500);
// pause
tft.fillRoundRect(25, 90, 78, 60, 8, ST7735_WHITE);
tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_GREEN);
tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_GREEN);
delay(500);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_BLUE);
delay(50);
// pause color
tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_RED);
tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_RED);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_GREEN);
}
[/code]

Ese proyecto se puede ver aquí:

Cool!  Podemos ver datos en una pantalla, usar menus, movernos en la pantalla, seleccionar y almacenar datos.  Si les interesa aprender que mas se puede hacer con una pantalla sencilla como esta, vean este blogpost de Flappy Bird and Arduino:

Arduino IoT Simple Tutorial Flappy Bird 1.8" TFT ST7735 Santiapps Marcio Valenzuela
Arduino IoT Simple Tutorial Flappy Bird 1.8″ TFT ST7735

http://www.mrt-prodz.com/blog/view/2015/03/flappy-bird-clone-on-the-atmega328-arduino-uno

Arduino (IoT): Simple Tutorial Estación Ambiental: Solar Parte III

Remote Solar Charging Weather Station Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Estación Ambiental Solar: Parte III

Ya tenemos la unidad de muestreo.  Ahora veamos la unidad central encargada de recibir los datos y mostrarlos en el LCD.

Requisitos:

  1. Computadora (mac)
  2. Arduino UNO & Nano
  3. Battery LiPo
  4. Modulo Carga Solar USB-LiPo
  5. DC-DC Booster
  6. DHT11
  7. Modulo RF 433MHz(Rx/Tx)
  8. 2 Breadboards
  9. LCD 16×2
  10. Arduino IDE (https://www.arduino.cc/en/Main/Software)

Finalmente llegamos a la Unidad Central o de Recepción de datos.

Unidad Central:

  • Rx RF de 433MHz para recepción y almacenamiento
  • Arduino UNO

La Unidad Central es la que recibirá los datos.  Como tal puede operar de una UNO completa ya que su consumo energético es mas grande pero podría estar conectada a un tomacorriente con USB.

El código del receptor seria mas o menos así:

[code]
//#include <Wire.h> // Wire library para i2c (A4 = SDA &amp; A5 = SCL)
//#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C library para control LCD en i2c protocol
#include <VirtualWire.h> // Virtual library para decode señal de Rx
#include <LiquidCrystal.h>
byte thermometer[8] = { //icono para thermometer
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
};
byte droplet[8] = { //icono para gota
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110,
};
byte hi[8]= {//icono para indice de calor
0B00000,
0B00000,
0B10101,
0B01110,
0B11111,
0B01110,
0B10101,
0B00000,
};
//(addr, EN,RW,RS,D4,D5,D6,D7,BL,BLpol)
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //cambiar address según i2c
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//borrowed from library examples LCDI2C
//LiquidCrystal_I2C lcd(0x27, 16, 2);
// Sensores
int humidity=0;
int temp=0;
int heat_index=0;
char MsgReceived[21];
int led = 13; //pin para LED
void setup(){
lcd.begin(16,2);
lcd.print(“Estacion Ambtl&gt;”);
lcd.setCursor(0,1);
lcd.print(“loading…”);
pinMode(led, OUTPUT);
delay(2000);
// VirtualWire
// Set rx pin first so setup wont conflict with default set from vw library
vw_set_rx_pin(9);
// Bits por seg
vw_setup(2000);
// Iniciar el receptor PLL funcionando
vw_rx_start();
lcd.createChar(1, thermometer);
lcd.createChar(2, droplet);
lcd.createChar(3, hi); // only 2 rows!
Serial.begin(19200);
} // END void setup
void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
//Tomar data de control base
lcd.setCursor(0,1);
lcd.print(“Listening…”);
if (vw_get_message(buf, &amp;buflen)){
lcd.print(“Got one!”);
digitalWrite(led, HIGH);
delay(100);
int i;
// Mensaje con checksum correcta recibida, botar.
for (i = 0; i &lt; buflen; i++){
// Llenar Msg Char array con chars del buffer.
MsgReceived[i] = char(buf[i]);
Serial.print(MsgReceived[i]);
}
sscanf(MsgReceived, “%d,%d,%d”,&amp;humidity, &amp;temp,&amp;heat_index); // Converts a string to an array
digitalWrite(led, LOW);
lcd_display();
memset( MsgReceived, 0, sizeof(MsgReceived));// This line is for reset the StringReceived
}
}
void lcd_display() {
//lcd.setCursor(1,0);
//lcd.print(“WEATHER STATION “);
lcd.setCursor(0,1);
//lcd.print(“T”);
//lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(1, 1);
lcd.print(temp);
lcd.write(0b11011111);
lcd.print(“C”);
//lcd.setCursor(6,1);
//lcd.print(“H”);
lcd.setCursor(6, 1);
lcd.write(2);
lcd.setCursor(7, 1);
lcd.print(humidity);
lcd.print(“%”);
//lcd.setCursor(11,1);
//lcd.print(“HI”);
lcd.setCursor(11, 1);
lcd.write(3);
lcd.setCursor(12, 1);
lcd.print(heat_index);
lcd.write(0b11011111);
lcd.print(“C”);
}[/code]

Perfecto!  Veamos el proyecto final:

Arduino Tutorial Estación Ambiental Santiapps Marcio Valenzuela
Arduino Tutorial Estación Ambiental

 

Ahora podemos muestrear periódicamente mientras nuestra Unidad de Carga alimenta la Unidad de Muestreo, la Unidad Central recibe los datos.  Necesitaríamos hacer algo con esos datos en la Unidad Central.  Los podríamos transmitir por WiFi, GPRS, BT, almacenarlos en una SD card o en este caso, mostrarlos en una LCD o TFT.

Para estos proyectos es importante poder calcular la capacidad de almacenamiento energético de las baterías y la capacidad de carga de los paneles.  Tenemos que poder producir suficiente energía durante el día para almacenar para toda la noche y así mismo tenemos que tener un almacén suficientemente grande para toda la noche.  Para ellos es vital conocer el consumo de nuestros componentes.

Como estimar la duración de nuestra batería:

Iavg = (Ton*Ion + Tsleep*Isleep ) / (Ton +Tsleep)

Ton (arduino activa ) = 250 ms =0.25s and Ion = 16mA

Tsleep = 5min =300s and Isleep = 200 uA (approx)

Iavg = 0.205 mA

Operating Voltage =5 V

Pavg=VxIavg =5x.205=1.026 mW

Li Ion battery capacity =3000 mAh

Battery voltage =3.7V

Power =3.7×3000=11100 mWh

Battery life = 11100/1.026 =10,818.7 hours = 15 meses mas o menos

 

Que podemos hacer con esta tecnología:

  • Dar autonomía energética a nuestros proyectos de exploración, monitoreo u otra función remota!