Tag Archives: arduino

Programador horario con Arduino

¡Hola a tod@s!

Últimamente estoy inmerso en un proyecto con Arduino. El proyecto en cuestión trata el diseño y programación de un controlador para la Pecera del Quinto. Uno de los primeros escollos a resolver es el programador horario y para ello he hecho la siguiente función. La función between(..) permite saber si la hora actual (o cualquier otra) está entre dos horas diferentes, además permite incluir una hora final en el siguiente día (ver ejemplo).

Código de la función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
 * Between is a method to check if current time is between two different times (initial time and final time). This method supports a 'final time' in the next day.
 * @param currHour integer (0-23) with the current hour.
 * @param currMinute integer (0-59) with the current minute.
 * @param initHour integer (0-23) with the initial hour.
 * @param initHour integer (0-59) with the initial minute.
 * @param finalHour integer (0-23) with the final hour.
 * @param finalMinute integer (0-59) with the final minute.
 * @return true if the current hour is between the two times (initial and final)
 * @author Oscar Sanchez Montaner (OSanchezMon)
 */
public static boolean between(int currHour, int currMinute, int initHour, int initMinute, int finalHour, int finalMinute) {
    boolean result = false;
 
    // Converting times to minutes.
    int  on = initHour  * 60 +  initMinute;
    int now = currHour  * 60 +  currMinute;
    int off = finalHour * 60 + finalMinute;
 
    // If final time is in the next day...
    if (finalHour < initHour) { // ... must first check if current time is above 12AM (24)...
        if (now > off) {
	    now += 1440; // ... if it is above; increase it 1440 minutes.
	}
	off += 1440; // Final time (for the next day) is always increased 1440 minutes.
    }
    // Development information.
    if (DEBUG_ON) {
        Serial.print("On: "); Serial.print(on); Serial.print(", Now: ");
        Serial.print(now); Serial.print(", Off: "); Serial.println(off);
    }
    // Check if current time is between initial and final time.
    if (now >= on && now < off) {
        result = true;
    }
 
    return result;
}

En el siguiente ejemplo se quiere saber si la hora actual está comprendida entre las 23:10 y las 10:10 (de la mañana siguiente).

Ejemplo de utilización:

1
2
3
4
5
6
7
if (between(hora_actual, minuto_actual, 23, 10, 10, 10)) {
    if (!relay02On) {
      digitalWrite(relay02Pin, HIGH);
      relay02On = true;
      logger("Relay 02 enabled.");
    }
}

Resultados de diferentes casos de prueba:

1
2
3
4
5
6
between(9, 0, 23, 10,  8, 59)); // On: 1390, Now: 1980, Off: 1979 -> false
between(9, 0, 23, 10,  9,  0)); // On: 1390, Now:  540, Off: 1980 -> false
between(9, 0, 23, 10,  9,  1)); // On: 1390, Now:  540, Off: 1981 -> false
between(9, 0, 10, 10,  8, 59)); // On:  610, Now: 1980, Off: 1979 -> false
between(9, 0,  8, 10,  9,  1)); // On:  490, Now:  540, Off:  541 ->  true
between(9, 0,  8, 10,  8, 11)); // On:  490, Now:  540, Off:  491 -> false