miércoles, 21 de octubre de 2015

Programador de Riego v2 328P




Programador de riego V2 328P:

  • 4 sectores
  • 4 arranques por sector
  • tiempo mínimo de riego 1 minuto, máximo 99 minutos
  • control manual
  • puesta en hora de reloj
  • porcentaje de tiempo de riego para ajustar programación sin cambiarla
  • guarda los datos en la memoria EEPROM y recupera la programación después de de reiniciarse
Presupuesto y componentes:
  • Arduino Pro-Mini (2€)
  • Joystick (1€)
  • RTC DS1307 (1€)
  • Módulo de 4 Relés (3€)
  • LCD1602 (2€)
  • Cables (1€)
  • Transformador USB (1€)
  • Transformador 24vac (12€)
  • Caja electrica (6€)
Total 29 €

jueves, 15 de octubre de 2015

Joystick LCD Menu Arduino

Os dejo aquí una plantilla de código para comenzar a trabajar, Es un sistema de menús en Arduino que utiliza un joystick como dispositivo de entrada.



Las características de este código son:

- La pantalla no parpadea, solo se refresca cuando mandemos.
- La estructura de menús no utiliza librerías especificas, todo está en el código.
- Con el botón del joystick entramos en modo edición para ingresar valores, cambiar estados, etc.
- El joystick tiene un retardo en la lectura para evitar lecturas falsas basado en el ejemplo "debounce" que viene con la IDE Arduino. Ademas, pasado ese tiempo, cada pulsación cuenta como una sola.

Cosillas que se quedaron en el tintero:

- Utilizo la última versión de la librería LiquidCristal_I2C. La primera comprobación que hay que hacer si no se muestran caracteres es regular el potenciómetro que esta detrás del LCD, en su circuito controlador. Si esto no resulta, para saber la dirección I2C de nuestra pantalla, cargamos en Arduino un código que encontraremos facilmente "googleando" "I2C scanner", que nos dará las direcciones de los dispositivos conectados al bus sda/scl.

Veo erratas en el código de abajo y dejo un enlace para que podáis descargarlo.


/*  
    LCD Menu & Joytick por JMLoureiro77

    http://jmloureiro77.blogspot.com.es

  328P Flash 5300 (17%) RAM 409(19%)

 - LCD SIN parpadeo
 - Sistema de menus SIN libreria
 - Joystick una pulsacion con retardo
 - editMode para introducir valores en Menu 1 

CC-BY 3.0 */

//---------------------------------------------------
// 1. Librerias
//---------------------------------------------------

#include "Wire.h"
#include "LiquidCrystal_I2C.h" 

//----------------------------------------------------
// 2. Pines
//----------------------------------------------------
#define xPin     A1   
#define yPin     A0   
#define kPin      7   
//SDA            A4
//SCL            A5

//----------------------------------------------------
// 3. Variables y Comandos
//----------------------------------------------------
int tCount1;
bool refresh;//lcd clear On/Off
//leerJoystick
int joyRead;
int joyPos; // lectura de 
int lastJoyPos;
long lastDebounceTime = 0; 
long debounceDelay = 100;               //user define
//Control Joystick
bool PQCP;
bool editMode;
//sistema de menus
int mNivel1;  
int mNivel2;  
//editmode
byte n[19];
int lastN;
int lcdX;
//int lcdY;
bool exiT;
//----------------------------------------------------
// 4. Objetos
//----------------------------------------------------
LiquidCrystal_I2C lcd(0x27,16,2); 

//====================================================
// SETUP
//====================================================
void setup() {
//----------------------------------------------------
// S1. Pines
//----------------------------------------------------
  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);
  pinMode(kPin, INPUT_PULLUP);
//----------------------------------------------------
// S2. Objetos
//----------------------------------------------------
  lcd.init();
  lcd.backlight(); 
}

//====================================================
// LOOP
//====================================================
void loop() {
  controlJoystick();
  menu();
/*  if (millis()%50==0){
    tCount1++;}
  if (tCount1>1000){tCount1=0;}*/
}

//====================================================
// Menu
//====================================================
void menu(){
  switch (mNivel1){
    case 0:
      menu0();//pantalla de inicio
    break;
    case 1:
        if(mNivel2==1){menu11();
        }else if (mNivel2==2){menu12();
        }else if (mNivel2==3){menu13();}
        else{menu1();}
    break;
    case 2:
      menu2();
        if(mNivel2==1){menu21();
        }else if (mNivel2==2){menu22();
        }else if (mNivel2==3){menu23();}
        else{menu2();}
    break;
    case 3:
      menu3(); //
    break;
  }//switch
}
//----------------------------------------------------
// Pantalla de inicio
//----------------------------------------------------
void menu0(){
  if (refresh){lcd.clear();refresh=0;}
  leeJoystick();
  lcd.setCursor(0,0);
  lcd.print("Pantalla Inicio");
}
//----------------------------------------------------
// Menu 1
//----------------------------------------------------
void menu1(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 1");
  lcd.setCursor(0,1);
//++++++++++++++++++++
  while(editMode){
    controlJoystick();
    lcd.setCursor(lcdX,1);
    if(n[lcdX]!=lastN){
      lcd.print(n[lcdX]);
      lastN=n[lcdX];
    }
  }
}
//-------------------------------------------------1.1
void menu11(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 1.1");
}
//-------------------------------------------------1.2
void menu12(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 1.2");
}
//-------------------------------------------------1.3
void menu13(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 1.3");
}
//----------------------------------------------------
// Menu 2
//----------------------------------------------------
void menu2(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 2");
}
//-------------------------------------------------2.1
void menu21(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 2.1");
}
//-------------------------------------------------2.2
void menu22(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 2.2");
}
//-------------------------------------------------2.3
void menu23(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 2.3");
}
//----------------------------------------------------
// Menu 3
//----------------------------------------------------
void menu3(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 3");
  switch (mNivel2){
    case 0:
      return;
    case 1:
      menu31();
    break;
    case 2:
      menu32();
    break;
    case 3:
      menu33();
    break;
    default:
    break;
  }//switch
}
//-------------------------------------------------3.1
void menu31(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 3.1");
}
//-------------------------------------------------3.2
void menu32(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 3.2");
}
//-------------------------------------------------3.3
void menu33(){
  if (refresh){lcd.clear();refresh=0;}
  lcd.setCursor(0,0);
  lcd.print("Menu 3.3");
}
//====================================================
// Control Joystic
//====================================================
void controlJoystick(){
  leeJoystick();
  if(PQCP) {
    PQCP=0;
    if (joyPos==5){editMode=!editMode;}
    switch (editMode){
       case 1: 
          lcd.blink();
          if (joyPos==4&&n[lcdX]<9 arriba="" if="" joypos="=3&&n[lcdX]" lcdx="" n="" refresh="0;}">0){n[lcdX]--;   //abajo
              refresh=0;} 
          if (joyPos==1&&lcdX<19 derecha="" if="" joypos="=2&&lcdX" lcdx="" refresh="0;}">0){lcdX--;         //izq
           refresh=0;}
        break;
        case 0:
          lcd.noBlink();
          if (mNivel1<3 abajo="" if="" joypos="=3){mNivel1++;" mnivel1="" mnivel2="0;}" refresh="1;">0&&joyPos==4){mNivel1--;    //arriba
            mNivel2=0;
            refresh=1;}
          if (mNivel2<3 derecha="" if="" joypos="=1){mNivel2++;" mnivel2="" refresh="1;}">0&&joyPos==2){mNivel2--;    //izq
           refresh=1;}
        }//!edit
  }//PQCP
}
int leeJoystick(){
  int x = analogRead(xPin);
  int y = analogRead(yPin);
  int k = digitalRead(kPin);
    if(x>900){joyRead=1;        //x+
    }else if(x<100 else="" if="" joyread="2;" x-="" y="">900){joyRead=3;  //y+
    }else if(y<100 -="" else="" if="" joyread="" k="" lastdebouncetime="" lastjoypos="" millis="" y-=""> debounceDelay)&&(joyRead!=joyPos)){
    joyPos=joyRead;
    if(!PQCP){PQCP=1;}
    }
  lastJoyPos=joyRead;
}

Programador de Riego v2 MEGA


Cosillas que se quedaron en el tintero:

- Aunque no se monte ESP-01 u otra versión de ESP8266, el programador funciona igual.

- Uso de memorias. Tal como está en el vídeo, el código ocupa un 38% de RAM y un 30% de FLASH, esto implica que se puede llegar a 20 sectores y mas arranques diarios.

- ESP, como punto de acceso añade capacidades interesantes. Imaginemos por ejemplo un jardinero, con un programador de este tipo en cada jardín en el que trabaja. Si todos tienen la misma configuración, SSID y contraseña, en cuanto llegase al jardín podría controlar el riego ahorrándose algún que otro paseo.

- Souliss y la APP Souliss se pueden encontrar en http://souliss.net/ y en Google Play Store

lunes, 12 de octubre de 2015

Comprar material de riego online en España

Buenas, hace tiempo que quería aportar mi opinión sobre este tema.

 La primera cuestión a tener en cuenta es ¿por que comprar por Internet material de riego?

 La ventaja principal es económica aunque poder presupuestar una instalación comparando precios y características sin salir de casa también es algo muy positivo. Mas cuando los "buenos" comercios de este tipo de material suelen ser comarcales, por no decir provinciales. 

Hablemos de precios. Por supuesto los gastos de envío de tubería de 50 mm de diámetro harán inviable la operación, aunque las empresas de mensajería ponen mucho de su parte (matando al mensajero a hacer horas extra sin). La tubería de gran diámetro no es el punto fuerte del comercio electrónico. Aunque para una buena instalación domestica con 32 mm e inferiores seria mas que suficiente, pudiendo emplear 40 mm en algunos casos especiales. Y ahí si que es muy recomendable comparar precios. (Al dimensionado de una instalación le dedicaré otra entrada) 

 ¿Que material comprar por Internet?
 Veamos algunos casos particulares:

 Electroválvulas.- Cuando en un comercio local nunca las he visto por menos de 21 €, en Internet se pueden encontrar desde 10 €. Esto implica que para una sola electroválvula con 5 € de gastos de envió ahorramos al menos 6 € comprando una sola. Diréis: -pero no son las mismas. - no, son las de 24 € en comercio local, las que tienen regulador de caudal. 
A parte de una manecilla para la apertura manual, tienen otra, en la parte superior, que actúa como un grifo impidiendo que pase más agua de la deseada. Esto es útil en sectores pequeños, que no consumen el caudal disponible y evita que salten conexiones por exceso de presión. Ajustaremos el caudal de paso al caudal consumido por el sector.

Comentar en este punto que hay dos tipos de electroválvulas dependiendo del voltaje y tipo de corriente que las activa: 
    "Normales",24vac, funcionan con 24 voltios de corriente alterna y son activadas por programadores "normales". 
     "Caras",9vcc, son para los programadores de pilas y usan 9 voltios corriente continua.

Si son de la misma marca, bastaría con cambiar el solenoide o electroimán, pero un solenoide de 9vcc anda por 18 €, igual que una electroválvula de 9vcc. De todas formas hay que evitar estos sistemas de riego pues las pilas de 9v son caras y es fácil gastar una al mes en verano.

Comentar también que las electroválvulas más baratas son las más vendidas, las de 32 mm (una pulgada, el sistema ingles se "orienta" por el diámetro interior), por lo tanto, aunque tengamos tubería de 25 mm (3/4"), es mas barato comprar la de 1" y los adaptadores.

Programadores de riego.- A veces hay ofertas interesantes en el comercio local, he visto los mismos productos al mismo precio, pero nunca más baratos.

Aspersores de jardinería.-18€ local, a partir de 8 en Internet, la misma marca, la misma serie.

Conectores y accesorios.- Aquí también gana el comercio Online. Siempre que podáis usad accesorios de plástico, los de latón envejecen mal. Aunque son los componentes mas económicos de la instalación, tambien son los más numerosos. En el comercio local su precio se puede multiplicar por tres o más.

¿donde comprar?

Este fue el principal motivo por el que me decidí a hacer esta entrada.
Desde hace un par de años he tenido experiencias variadas con las tres tiendas en las que he comprado: 
Mercagarden.- Para mi los mejores desde el punto de vista de la atención al cliente, aunque su pagina web es un poco mejorable y no tienen el primer precio en todos los artículos. Aceptan PayPal y las entregas son muy rápidas 
Poolaria.- Esta pagina si que es un descontrol pero tienen una buena sección en programadores de riego, además de maquinaria de jardín. No me gusta que en algunos conectores que veo en otros sitios por menos de un euro aquí pueden llegar a 6 €. Son excepciones. Aceptan PayPal y los plazos de entrega son razonables.

Antes de hacer un pedido lleno la cesta en las dos paginas y compruebo incluso combinaciones.

RiegoPro.- No aceptan PayPal. Después del pedido descubrí por que. No se porque no usan fotos de tías para vender material de riego. Tendría mayor efectividad a la hora de describir sus artículos. Cualquier parecido con la foto mostrada es pura casualidad debería decir el cocodrilo en la primera página.

Ellos responden a la pregunta de por que no comprar material de riego online.

Tienen un formulario para devolver los artículos, pagando tu los portes(correcto), pero el encargado de revisarlo debe ser el mismo que lleva el tema de la fotografía.
Aprovecho para mandarles un saludo y comentar que aun espero su llamada, o un correo, mi número de teléfono está en la sección de contacto. Animo campeones! Solo podéis mejorar.

Bueno, termino, como dice mi padre: "non hai como dar na cabeza de un"

Si conocéis otras páginas o queréis aportar algo, decir que no cobran por escribir comentarios.

Un Saludo