Funciones varias

Funciones para manipular otras cosas en Arduino.

1. tone()

Genera una onda cuadrada de la frecuencia especificada (y un ciclo de trabajo del 50%) en un pin. Se puede especificar una duración, de lo contrario, la ola continúa hasta que se llame a noTone(). El pin se puede conectar a un zumbador piezoeléctrico u otro altavoz para reproducir tonos. Solo se puede generar un tono a la vez. Si ya se está reproduciendo un tono en un pin diferente, la llamada a tono() no tendrá efecto. Si el tono se reproduce en el mismo pin, la llamada establecerá su frecuencia.

El uso de la función tone() interfiere con las salida PWM de los pines 3 y 11. No es posible generar todos inferiores a 31 Hz.

tone(pin, frecuencia);
tone(pin, frecuencia, duración);

La frecuencia sera un unsigned int y la duración unsigned long. Si desea reproducir diferentes tonos en varios pines, debe llamar a la función noTone() a un pin antes de llamar a un nuevo tone() en el siguiente pin.

2. noTone()

Detiene la generación de una onda cuadrada activada por la función tone(). No tiene efecto si no se genera ningún tono.

noTone(pin);

Si desea reproducir diferentes tonos en varios pines, debe llamar a la función noTone() a un pin antes de llamar a un nuevo tone() en el siguiente pin.

3. pulseln()

Lee un pulso (HIGH o LOW) en un pin y devuelve la duración del pulso en microsegundos o 0 si no se inicia ningún pulso dentro de un tiempo de espera especificado. La función pulseIn() espera que el pin pase a HIGH, inicia el cronometraje, luego espera que el pin pase a LOW y detiene el cronometraje. Devuelve la longitud del pulso en microsegundos o 0 si el pulso no se completa dentro del tiempo de espera determinado con "espera".

pulseIn(pin, valor);
pulseIn(pin, valor, espera);

Valor es el tipo de pulso a identificar: HIGH o LOW. Espera es el numero de us que espera el pulso. El predeterminado es 1 segundo.

Funciona bien con pulsos desde 10 us a 3 min de duración.

insigned long duracion:
void setup(){
	pinMode(7, INPUT);
}
void loop(){
	duracion = pulseIn(7, HIGH);
}

4. pulseLnLong()

5. shiftln()

Desplaza en un byte de datos un bit cada vez. Comienza a partir del bit más significativo (más a la izquierda) o menos significativo (más a la derecha). Para cada bit, el pin de reloj pasa a nivel alto, el siguiente bit se lee de la línea de datos y a continuación el pin de reloj pasa a nivel bajo. Retorna el byte leido.

byte x = shiftIn(dataPin, clockPin, bitOrder);

En dataPin pondrás el puerto a leer, el clockPin es el pin que comandara el cambio (reloj) y bitOrder puede ser MSBFIRST (Primero el bit más significativo) o LSBFIRST (Primero el bit menos significativo).

Si vamos a interactuar con un dispositivo que está sincronizado por flancos de subida (rising)), necesitamos asegurarnos de que el pin de reloj está en estado LOW antes de la primera llamada a shiftIn() con una llamada a digitalWrite(pinReloj, LOW).

Esta es una aplicación por software; Arduino también proporciona un bus SPI que es la complementación por hardware, más rápida, pero sólo funciona en pines específicos.

6. shiftOut()

Desplaza en un byte de datos un bit a cada vez. Comienza a partir del bit más significativo (más a la izquierda) o menos significativo (más a la derecha). Cada bit se escribe a su vez en un pin de datos, después de lo cual un pulso de reloj se activa (pasa a nivel alto, y a continuación, a nivel bajo) para indicar que el bit está disponible.

byte x = shiftOut(dataPin, clockPin, bitOrder, valor);

si estamos conectados con un dispositivo que está sincronizado por flancos de subida (rising), necesitamos asegurarnos de que el pin de reloj está a nivel bajo antes de llamar a la función shiftOut(), por ejemplo, con una llamada a digitalWrite(pinReloj, LOW).

Los dataPin y clockPin deben estar ya configurados como salida con pinMode(). La función shiftOut() escribe en la salida 1 byte (8 bits) por lo que requiere una operación de dos pasos para valores de salida mayores que 255.

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
void loop() {
  for (int j=0; j<256; j++) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);   
    //devuelve el latch pin a nivel alto indicando que ya no necesita escuchar la información
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
} 

7. sizeof()

Devuelve el número de bytes de una variable o el número de bytes ocupados por una matriz. Acepta cualquier tipo: byte, int, float.

sizeof(variable);

Esta función es útil para trabajar con matrices o datos tipo string donde es conveniente ser capaz de cambiar el tamaño de la matriz sin romper otras partes del programa.

char matriz[]="Esto es una matriz";
void setup(){
	Serial.begin(9600);
}
void loop(){
	if (int n=0; n<sizeof(matriz)-1; i++{
		Serial.print(i);
		Serial.print(" = ");
		Serial.println(matriz[i]);
	}
	delay(5000);
}

Tenga en cuenta que una cadena bien formada termina con el símbolo NULL, que tiene un valor ASCII 0.