Agregar buzzer a codigo (solucionado)

Hola de nuevo gracias a todos por los aportes que habeis echo para ajudarme a cambiar este codigo a modo i2c que ya esta solucionado,este post va referido a una cosa que a mi parecer le falta a este codigo que por cierto esta muy bien ,y es que estaria muy bien implatado cosa puedo hacer y es implantar un buzzer,el cual sonara cuando aprietas las teclas,un sonido distinto cuando el password sea correcto y otro sonido distinto cuando sea el password incorrecto.

Gracias a todos y aqui ya os dejo el codigo modificado a i2c para quien lo quiera copiar,logicamente le falta el buzzer....

//Creado por Ryutaku versión 2.0
// ryutaku.com
//Programa para una caja fuerte en arduino
//Para diagramas visitar ryutaku.com
//200415
#include <Keypad.h> // Controla el teclado
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Servo.h>  //Control del servomotor
#include <EEPROM.h>  //COntrola E/S EEPROM
#define CERRAR 90 //Calibrar a gusto la pos del servomotor cerrado
#define ABRIR 180 //Calibrar a gusto la pos del servomotor abierto
//*****************************************
//*** Declaracion de variables locales*****
//*****************************************
Servo seguro;   //servomotor
LiquidCrystal_I2C lcd(0x27,2, 1, 0, 4, 5, 6, 7, 3, POSITIVE );//display LCD
const byte filas = 4;
const byte columnas = 4;
byte pinsFilas[filas] = {9, 10, 11, 12};
byte pinsColumnas[columnas] = {14, 15, 16, 17};
char teclas[filas][columnas] =  {
  {'1', '2', '3', 'A'},                       // Declaración del teclado
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};
Keypad teclado = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);
char password[5]; //almacena la contraseña en eeprom
char ingreso;  //ingreso del usuario
char passUser[4];
char confirmPass[4];  //confirmacion de la contraseña
//char ca[7] = {'3', '7', '1', '9', '2', 'A'}; //clave admin establecida
//char cal[7];   // Clave admin leida
//int contador = 0; //Lleva la posicion del array
//int cursorr = 6; //Lleva la posicion del cursor
//int comp;  // comparacion entre 2 arrays
int i=0;
int a; //aux
void setup() {
  pinMode(19, OUTPUT); // LEDS QUE INDICAN ABIERTO(13) O CERRADO(19)
  pinMode(13, OUTPUT);
  digitalWrite(19, HIGH); //enciende el led de cerrado
  seguro.attach(18);  // Pin del servomotor
  seguro.write(CERRAR);
  lcd.begin(16, 2);   //Configuracion lcd 16X2 (columnas,fila)
  seguro.write(90);  //Cerrar puerta
  lcd.setCursor(0, 0);
  lcd.print("  **PASSWORD** ");
  lcd.setCursor(5, 1);
  lcd.print("____");
  //LEER CONTRASEÑA DE LA EEPROM 

//        error if(password[4]!='Z'){     
    //correción
    if(EEPROM.read(4)!='Z'){
    EEPROM.write(0,'1');
    EEPROM.write(1,'2');
    EEPROM.write(2,'3');
     EEPROM.write(3,'4');
    EEPROM.write(4,'Z'); 
  }
   for (int i = 0; i <= 4; i++) { 
    password[i] = EEPROM.read(i);
  }              
  
}//fin del setup

void loop() {
    leerIngreso(1);
}
 




////////////////////////////////////////////

void leerIngreso(int a) {
  ingreso = teclado.getKey();
  if (ingreso != NO_KEY)
    switch (ingreso) {
      case 'A':    // es como el "enter" para introducir la password
        if(evaluar(1)==1)
        correcto();
        else{
        msgError();
        }
        reset();
        break;
        
      case 'B':
        informacion();  //muestra en el lcd las opcionesde la caja fuerte
        reset();
        break;
        
      case 'C':
        cambioPass();
        reset();
        break;
      case 'D':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste D");
        delay(300);
        seguro.write(CERRAR);
        reset();
        break;
      case '*':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste *");
        delay(300);
        reset();
        break;
      case '#':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste #");
        delay(300);
        reset();
        break;
      default: //si es un numero debe imprimirlo en el LCD y ademas guardarlo en el arreglo passUser
        if(a==1){
        passUser[i] = ingreso;
        printPass(passUser[i], 5 + i, 1);
        }
        if(a==2){
        confirmPass[i] = ingreso;
        printPass(confirmPass[i], 5 + i, 1);
        }
        i++;
        if (i > 3)
          i = 0;
   
}
}

void cleanlcd() {
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");
}


void printPass(char a, int columna, int fila ) {
  lcd.setCursor(columna, fila);
  lcd.print(a);
  delay(100);
  lcd.setCursor(columna, fila);
  lcd.print("*");
}

int evaluar(int a) {
  int j = 0;
  if (a==1){
  for (int i = 0; i <= 3; i++) {
    if (password[i] == passUser[i]) {
        j++;
    }
  }
  }
  if(a==2){
  for (int i = 0; i <= 3; i++) {
    if (passUser[i] == confirmPass[i]) {
        j++;
    }
  }
  }
  if (j == 4) {
    return j=1;
  }
  else {
    return j=0;
  }
}


void reset() {
  lcd.setCursor(0, 0);
  lcd.print("  **PASSWORD** ");
  lcd.setCursor(5, 1);
  lcd.print("____");
  for(int i =0;i<=3;i++){
  passUser[i]=NO_KEY;
  confirmPass[i]=NO_KEY;
  }
  i=0;
}

void msgError(){
  
        lcd.setCursor(0, 0);
        lcd.print("      ERROR      ");
        delay(500);
      
    
  }

void correcto(){
  
        lcd.setCursor(0, 0);
        lcd.print("     CORRECTO      ");
        //Abrir servomotor
        seguro.write(ABRIR);
        delay(500);
}

  
void informacion() {
  lcd.setCursor(0, 0);
  lcd.print("'A' para introdu");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("cir la pass        ");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("'C' para cambiar");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print(" la pass             ");
  delay(200);
}



void cambioPass() {
   lcd.setCursor(0, 0);
  lcd.print("Cambio de pass    ");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("Introduce pass     ");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("anterior        ");
  delay(200);  
  reset();
   while(passUser[3]==NO_KEY){
    leerIngreso(1);}
  if (evaluar(1) == 1) {
    lcd.setCursor(0, 0);
    lcd.print("Introduce           ");
    delay(200);
    lcd.setCursor(0, 0);
    lcd.print("la pass nueva            ");
    delay(200);
    reset();
    while(passUser[3]==NO_KEY){
      leerIngreso(1);
  }
    lcd.setCursor(0, 0);
    lcd.print("Vuelve a intro     ");
    delay(200);
    lcd.setCursor(0, 0);
    lcd.print("cirla           ");
    delay(200);    
    lcd.setCursor(0, 0);
    lcd.print("  **PASSWORD**      ");
    lcd.setCursor(5, 1);
    lcd.print("____");
    lcd.setCursor(0, 0);
    i=0;
    while(confirmPass[3]==NO_KEY){
      leerIngreso(2);
  }
    if(evaluar(2)==1){
      // funcion de EEPROM
      for (int i = 0; i <= 3; i++) { 
         EEPROM.write(i, passUser[i]);
    }
      for (int i = 0; i <= 3; i++) { 
         password[i] = EEPROM.read(i);
  }
      lcd.setCursor(0, 0);
      lcd.print("Contraseña cam  ");
      delay(200);
      lcd.setCursor(0, 0);
      lcd.print("biada           ");
      delay(200);
    }
    else{
      lcd.setCursor(0, 0);
      lcd.print("Error las pass   ");
      delay(200);
      lcd.setCursor(0, 0);
      lcd.print("no coinciden        ");
      delay(200);
    }
    
  }
  else {
    msgError();
  }
  reset();
}

void passChange(){
 for(int i=0;i<=3;i++){
   password[i]=passUser[i];
 }
  
}

Si quieres agregar un buzzer; necesito saber de antemano a cual pin lo vas a conectar.
Esto es necesario porque para generar un pitido a determinada frecuencia, es preferible utilizar la "manipulación de puertos" ("port manipulation" en inglés).
Estos "puertos", están agrupados en ocho pines, por eso necesito saber a cuál conectarías el buzzer; para hacerlo correctamente...

Tan simple como agregar

tone(pin, Frecuencia, duracion);

surbyte:
Tan simple como agregar

tone(pin, Frecuencia, duracion);

O, eso también... :sweat_smile:
Lo que yo iba a proponer era más complicado que eso, pero tiene la característica de poder regular el "volumen" de ese pitido (es como crear una especie de PWM).
Si no quieres complicarte la vida, entonces no me hagas caso... :cold_sweat:

Para la próxima una simple búsqueda en google: arduino sonido hubiera arrojado estos resultados o sugerencias.

Lucario448:
Si quieres agregar un buzzer; necesito saber de antemano a cual pin lo vas a conectar.
Esto es necesario porque para generar un pitido a determinada frecuencia, es preferible utilizar la "manipulación de puertos" ("port manipulation" en inglés).
Estos "puertos", están agrupados en ocho pines, por eso necesito saber a cuál conectarías el buzzer; para hacerlo correctamente...

Gracias por tu colaboración,la verdad es que no se como colocar el buzzer,ya e cambiado los pins y arrgelado el desaguisado que habia de pines al menos los e dejado en orden y todo me compila bien,el pin 13 se queda libre valdria ese? o si no esta libre a1,a2,a3..

gracias aqui dejo el codigo ya en orden los pines.

//Creado por Ryutaku versión 2.0
// ryutaku.com
//Programa para una caja fuerte en arduino
//Para diagramas visitar ryutaku.com
//200415
#include <Keypad.h> // Controla el teclado
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Servo.h>  //Control del servomotor
#include <EEPROM.h>  //COntrola E/S EEPROM
#define CERRAR 90 //Calibrar a gusto la pos del servomotor cerrado
#define ABRIR 180 //Calibrar a gusto la pos del servomotor abierto
//*****************************************
//*** Declaracion de variables locales*****
//*****************************************
Servo seguro;   //servomotor
LiquidCrystal_I2C lcd(0x27,2, 1, 0, 4, 5, 6, 7, 3, POSITIVE );//display LCD
const byte filas = 4;
const byte columnas = 4;
byte pinsFilas[filas] = {2, 3, 4, 5};
byte pinsColumnas[columnas] = {6, 7, 8, 9};
char teclas[filas][columnas] =  {
  {'1', '2', '3', 'A'},                       // Declaración del teclado
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};
Keypad teclado = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);
char password[5]; //almacena la contraseña en eeprom
char ingreso;  //ingreso del usuario
char passUser[4];
char confirmPass[4];  //confirmacion de la contraseña
//char ca[7] = {'3', '7', '1', '9', '2', 'A'}; //clave admin establecida
//char cal[7];   // Clave admin leida
//int contador = 0; //Lleva la posicion del array
//int cursorr = 6; //Lleva la posicion del cursor
//int comp;  // comparacion entre 2 arrays
int i=0;
int a; //aux
void setup() {
  pinMode(10, OUTPUT); // LEDS QUE INDICAN ABIERTO(13) O CERRADO(19)
  pinMode(11, OUTPUT);
  digitalWrite(10, HIGH); //enciende el led de cerrado
  seguro.attach(11);  // Pin del servomotor
  seguro.write(CERRAR);
  lcd.begin(16, 2);   //Configuracion lcd 16X2 (columnas,fila)
  seguro.write(90);  //Cerrar puerta
  lcd.setCursor(0, 0);
  lcd.print("  **PASSWORD** ");
  lcd.setCursor(5, 1);
  lcd.print("____");
  //LEER CONTRASEÑA DE LA EEPROM 

//        error if(password[4]!='Z'){     
    //correción
    if(EEPROM.read(4)!='Z'){
    EEPROM.write(0,'1');
    EEPROM.write(1,'2');
    EEPROM.write(2,'3');
     EEPROM.write(3,'4');
    EEPROM.write(4,'Z'); 
  }
   for (int i = 0; i <= 4; i++) { 
    password[i] = EEPROM.read(i);
  }              
  
}//fin del setup

void loop() {
    leerIngreso(1);
}
 




////////////////////////////////////////////

void leerIngreso(int a) {
  ingreso = teclado.getKey();
  if (ingreso != NO_KEY)
    switch (ingreso) {
      case 'A':    // es como el "enter" para introducir la password
        if(evaluar(1)==1)
        correcto();
        else{
        msgError();
        }
        reset();
        break;
        
      case 'B':
        informacion();  //muestra en el lcd las opcionesde la caja fuerte
        reset();
        break;
        
      case 'C':
        cambioPass();
        reset();
        break;
      case 'D':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste D");
        delay(300);
        seguro.write(CERRAR);
        reset();
        break;
      case '*':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste *");
        delay(300);
        reset();
        break;
      case '#':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste #");
        delay(300);
        reset();
        break;
      default: //si es un numero debe imprimirlo en el LCD y ademas guardarlo en el arreglo passUser
        if(a==1){
        passUser[i] = ingreso;
        printPass(passUser[i], 5 + i, 1);
        }
        if(a==2){
        confirmPass[i] = ingreso;
        printPass(confirmPass[i], 5 + i, 1);
        }
        i++;
        if (i > 3)
          i = 0;
   
}
}

void cleanlcd() {
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");
}


void printPass(char a, int columna, int fila ) {
  lcd.setCursor(columna, fila);
  lcd.print(a);
  delay(100);
  lcd.setCursor(columna, fila);
  lcd.print("*");
}

int evaluar(int a) {
  int j = 0;
  if (a==1){
  for (int i = 0; i <= 3; i++) {
    if (password[i] == passUser[i]) {
        j++;
    }
  }
  }
  if(a==2){
  for (int i = 0; i <= 3; i++) {
    if (passUser[i] == confirmPass[i]) {
        j++;
    }
  }
  }
  if (j == 4) {
    return j=1;
  }
  else {
    return j=0;
  }
}


void reset() {
  lcd.setCursor(0, 0);
  lcd.print("  **PASSWORD** ");
  lcd.setCursor(5, 1);
  lcd.print("____");
  for(int i =0;i<=3;i++){
  passUser[i]=NO_KEY;
  confirmPass[i]=NO_KEY;
  }
  i=0;
}

void msgError(){
  
        lcd.setCursor(0, 0);
        lcd.print("      ERROR      ");
        delay(500);
      
    
  }

void correcto(){
  
        lcd.setCursor(0, 0);
        lcd.print("     CORRECTO      ");
        //Abrir servomotor
        seguro.write(ABRIR);
        delay(500);
}

  
void informacion() {
  lcd.setCursor(0, 0);
  lcd.print("'A' para introdu");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("cir la pass        ");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("'C' para cambiar");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print(" la pass             ");
  delay(200);
}



void cambioPass() {
   lcd.setCursor(0, 0);
  lcd.print("Cambio de pass    ");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("Introduce pass     ");
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("anterior        ");
  delay(200);  
  reset();
   while(passUser[3]==NO_KEY){
    leerIngreso(1);}
  if (evaluar(1) == 1) {
    lcd.setCursor(0, 0);
    lcd.print("Introduce           ");
    delay(200);
    lcd.setCursor(0, 0);
    lcd.print("la pass nueva            ");
    delay(200);
    reset();
    while(passUser[3]==NO_KEY){
      leerIngreso(1);
  }
    lcd.setCursor(0, 0);
    lcd.print("Vuelve a intro     ");
    delay(200);
    lcd.setCursor(0, 0);
    lcd.print("cirla           ");
    delay(200);    
    lcd.setCursor(0, 0);
    lcd.print("  **PASSWORD**      ");
    lcd.setCursor(5, 1);
    lcd.print("____");
    lcd.setCursor(0, 0);
    i=0;
    while(confirmPass[3]==NO_KEY){
      leerIngreso(2);
  }
    if(evaluar(2)==1){
      // funcion de EEPROM
      for (int i = 0; i <= 3; i++) { 
         EEPROM.write(i, passUser[i]);
    }
      for (int i = 0; i <= 3; i++) { 
         password[i] = EEPROM.read(i);
  }
      lcd.setCursor(0, 0);
      lcd.print("Contraseña cam  ");
      delay(200);
      lcd.setCursor(0, 0);
      lcd.print("biada           ");
      delay(200);
    }
    else{
      lcd.setCursor(0, 0);
      lcd.print("Error las pass   ");
      delay(200);
      lcd.setCursor(0, 0);
      lcd.print("no coinciden        ");
      delay(200);
    }
    
  }
  else {
    msgError();
  }
  reset();
}

void passChange(){
 for(int i=0;i<=3;i++){
   password[i]=passUser[i];
 }
  
}

Pin 13? Es posible.
Ya lo que no sé, es si lo quieres hacer del modo fácil (propuesto por surbyte), o de modo "relativamente difícil" (propuesto por mi). Digo "relativamente difícil", porque ese pedazo de código lo podría explicar con comentarios.

no se lo dejo en tus manos si me quieres echar una mano,e detectado un fallo con arduino uno los pines digitales A4 Y A5 estan usados por el lcd i2c,el teclado de 4x4 lo e cambiado las filas y las columnas,pero hay teclas como la A,B,C y D no van bien asi que lo voy hacer como el original pero en ATMEGA 2560 y dejo a tu eleccion el pin que mas te convenga o menos trabajo te de para el buzzer.

Muchas gracias

vamos enter_67, solo agrega

tone(13, 500, 200);

y tendras un pitido de 500 hz durante 200mseg, quieres mas tiempo sube 200 por 1000 por ejemplo

disculpa mi ignorancia surbyte pero no se en que linea debo de ponerlo...

Ahhh donde tu quieras que genere el sonido.. no se donde piensas usarlo?

Perdona ahora veo que quieres hacer.
Mira... pon un comando como el que te he dicho cuando se presione una tecla

void leerIngreso(int a) {
  ingreso = teclado.getKey();
  if (ingreso != NO_KEY) {
    tone(13, 500, 100); // tono de 500 Hz durante 100mseg corto
    switch (ingreso) {
      case 'A':    // es como el "enter" para introducir la password
        if(evaluar(1)==1)
        correcto();
        else{
        msgError();
        }
        reset();
        break;
        
      case 'B':
        informacion();  //muestra en el lcd las opcionesde la caja fuerte
        reset();
        break;
        
      case 'C':
        cambioPass();
        reset();
        break;
      case 'D':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste D");
        delay(300);
        seguro.write(CERRAR);
        reset();
        break;
      case '*':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste *");
        delay(300);
        reset();
        break;
      case '#':
        lcd.setCursor(0, 0);
        lcd.print("Presionaste #");
        delay(300);
        reset();
        break;
      default: //si es un numero debe imprimirlo en el LCD y ademas guardarlo en el arreglo passUser
        if(a==1){
        passUser[i] = ingreso;
        printPass(passUser[i], 5 + i, 1);
        }
        if(a==2){
        confirmPass[i] = ingreso;
        printPass(confirmPass[i], 5 + i, 1);
        }
        i++;
        if (i > 3)
          i = 0;
   }
}
}[code]

gracias por tù paciencia surbyte pero soy muy negado y de programación se muy poco ando mirando tutoriales y...ando un poco perdido cambie el lcd de 4 bits a i2c pero no se mucho mas....quiero que suene tit el buzzer cada ves que introduzca un digito,y que al da error suene bee,y al abrir suene bii(los ruidos son ejemplos)

Me imagino que tecla que presiones, o el momento que se verifica la contraseña pasa por alguna condicional (if, else, while, switch, etc.), cierto?
Si es así, simplemente coloca la función del buzzer después de esa condicional.

Estaba trabajando en mi versión para generar sonido, pero mejor la hago fácil de usar :smiley:

Bueno no viste que te agregué algo para que asi fuera cuando ingresás digitos?

void leerIngreso(int a) {
  ingreso = teclado.getKey();
  if (ingreso != NO_KEY) {
    // ACA SUME EL TONO para cada digito 
    tone(13, 500, 100); // tono de 500 Hz durante 100mseg corto
  ... seguir con el resto ....

pues chicos siento deciros que ese codigo no funcionaba bien al poner el pass,pido mil disculpas indagando e encontrado el codigo mejorado del autor el cual tenia mas lio que yo y es la leche de grande ahora si hace todas las funciones la teclas,....siento sin saber donde meter el buzzer....

me vais a matar...pero al menos encontrado el codigo bueno y os lo dejo.

caja fuerte buena.ino (13.8 KB)

enter_67:
....siento sin saber donde meter el buzzer....

me vais a matar...

Conmigo no hay problema, yo jamás te mataría :stuck_out_tongue:
No sé si te quedó claro donde colocar la función en el código.

En la parte física: solo conecta el buzzer en cualquier pin digital que te quede disponible (excepto los pines 0 y 1; esos están reservados para la comunicación serial)

Gracias Lucario448 y a Surbyte tambien......entre uno y otro no me aclaro de donde colocarlo solo se que el codigo este ultimo esta OK ....le falta mi talon de aquiles el sonido del buzzer..al final lo tengo todo en una Atmega 2560 asi que me da igual el pin que sea para mi " bestia negra".

enter_67:
....le falta mi talon de aquiles el sonido del buzzer..al final lo tengo todo en una Atmega 2560 asi que me da igual el pin que sea para mi " bestia negra".

De acuerdo. Lo que falta es decidir nada más es el pin dónde conectarlo; y debe coincidir el número de ese pin, con el del código; sino... pues obviamente no funcionaría... :stuck_out_tongue:

Hola Lucario448 pues para romper el hielo el pin 13!

enter_67:
Hola Lucario448 pues para romper el hielo el pin 13!

Romper el hielo? Qué? Quieres conversar conmigo? Jajajajajajaja.

Modo fácil:

tone(13, 1000, 100); // Pitar en el pin 13, a 1 KHz por 100 milisegundos

La frecuencia la escoges para distinguir la razón del pitido.

Ahora sí, a mi modo:

void pitar(unsigned int frecuencia, unsigned long duracion, byte volumen) {
  // Validaciones
  if (volumen == 0) { // Si el volumen está en cero, entonces solo producirá delay
    PORTB = 0; // Esto apaga los pines del 8 al 13
    delay(duracion);
    return;
  }
  if (frecuencia < 50) { // Si la frecuencia está por debajo de 50, no hacer nada
    return;
  }
  if (volumen > 100) { // El volumen máximo es 100
    volumen = 100;
  }
  // Cálculos
  unsigned int period = 1000000UL / frecuencia; // Periodo de la onda, en microsegundos
  unsigned int onTime = map(volumen, 0, 100, 0, period); // Tiempo encendido. En PWM, esto se llama "ciclo de trabajo"
  unsigned int offTime = period - onTime; // Diferencia del periodo y tiempo encendido = tiempo apagado
  unsigned long repeatCount = (1000 / period) * duracion;
  // Calcula las repeticiones necesarias para que el pitido tarde el tiempo especificado en la variable "duracion" 
  PORTB = 0; // Poner en LOW los pines del 8 al 13
  for (unsigned long count; count < repeatCount; count++) { // Repetir hasta que se tarde el tiempo especificado
    PORTB = B10000000; // Encender pin 13 más velozmente que digitalWrite
    delayMicroseconds(onTime); // Mantener el "tiempo encendido" en el lapso precalculado
    PORTB = 0; // Apagar pin 13 más velozmente que digitalWrite
    delayMicroseconds(offTime); // Mantener el "tiempo apagado" en el lapso precalculado
  }
}

El código original también pedía el número del pin, pero esto lo hacía más largo; y por alguna razón nunca pasaba la parte de la validación.

Nótese que lo que acabo de postear es una función; por lo tanto, no debe ir dentro de otra. Más bien, dentro del código ya existente, la puedes usar así:

pitar(1000, 100, 50); // Recuerda que el tercer parámetro es el volumen en escala del 0 al 100

Por último, que ni se te ocurra poner una frecuencia superior a los 20000 (20 KHz), porque lo más probable es que el pitido se vuelva demasiado molesto, o ni se alcance a oír (por razones biológicas).