// #include <math.h>

// #define PIN 9
// #define PI 3.1415926535897932384626433832795

// void setup() {
//   pinMode(PIN, OUTPUT);
//   Serial.begin(9600); // Inicia a comunicação serial
// }

// void loop() {
//   for (int i = 0; i < 360; i++) {
//     float radian = i * PI / 180.0;
//     float sineWave = abs(sin(radian)) * 127.5 + 127.5; // Gera o módulo de uma onda senoidal entre 0 e 255
//     Serial.println(sineWave); // Imprime o valor flutuante de sineWave
//     analogWrite(PIN, (int)sineWave);
//     delay(2); // Atraso para a próxima amostra
//   }
// }
// #include <math.h>

// // Defina o pino PWM que você usará para gerar a onda
// const int pinPWM = 9;

// // Defina a frequência inicial da onda (em Hz)
// float frequencia = 100.0; 

// // Defina a amplitude da onda (0-255 para um pino PWM de 8 bits)
// const int amplitude = 127;

// void setup() {
//   // Configura o pino PWM como saída
//   pinMode(pinPWM, OUTPUT);
// }

// void loop() {
//   // Calcula o período da onda a partir da frequência
//   float periodo = 1.0 / frequencia;

//   // Gera a onda senoidal e envia para o pino PWM
//   for (float angulo = 0; angulo < 2 * M_PI; angulo += 0.01) {
//     // Calcula o valor da onda senoidal
//     float valor = amplitude * (sin(angulo) + 1);

//     // Envie o valor para o pino PWM
//     Serial.println(valor);
//     analogWrite(pinPWM, valor);

//     // Aguarda pelo tempo de um ciclo completo da onda
//     delayMicroseconds(periodo * 1000000);
//   }
// }



// int F = 2;//hz                                                   //frequency of the signal
// int Fs = 500;//hz                                                //sampling frequency
// int n = 500;//samples                                                 //number of samples
// float t;//sec                                                     //Time instance
// int sampling_interval;
// byte samples[500];                                           // to store the samples

// void setup() {
//   Serial.begin(9600);
//   // pinMode(10, OUTPUT);
//   for (int n = 0; n < 500; n++)
//   {
//     t = (float) n / Fs;                                       //creating time isntance to find the 500 samples
//     samples[n] = (byte) (127.0 * sin(2 * 3.14 * t) + 127.0 ); //calculating the sin value at each time instance
//   }
//   sampling_interval = 1000000 / (F * n);
//   Serial.println(sampling_interval);
//   //sampling interval Ts = 1/frequency x number of sample (Ts = 1/Fn or Ts = T/n)x1000000 to convert it in µS
//   delay(3000); 
//   for (int j = 0; j < 500; j++){
//   Serial.println(samples[j]);
//   }
//   delay(3000); 
// }

// void loop() {
//   for (int j = 0; j < 500; j++) {
//     // analogWrite(10, samples[j]);
//     Serial.println(samples[j]);
//     delayMicroseconds(sampling_interval);                      //time interval
//   }
// }


int F = 20;                                                  //frequency of the signal
int Fs = 10000;                                              //sampling frequency
int n = 1500;                                                 //number of samples
float t;                                                     //Time instance
int sampling_interval;
byte samples[1500];                                           // to store the samples

void setup() {
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  for (int n = 0; n < 1500; n++)
  {
    t = (float) n / Fs;                                      //creating time instance to find the 1500 samples
    samples[n] = (byte) (127.0 * sin(2 * 3.14 * t) + 127.0 ); //calculating the sin value at each time instance
  }
  sampling_interval = 1000000 / (F * n);                     
  //sampling interval Ts = 1/frequency x number of sample (Ts = 1/Fn or Ts = T/n)x1000000 to convert it in µS
}

void loop() {
  for (int j = 0; j < 1500; j++) {
    analogWrite(10, samples[j]);
    Serial.println(samples[j]);
    delayMicroseconds(sampling_interval);                     //time interval
  }
}