diff --git a/examples/Waveform_Generator/Waveform_Generator.ino b/examples/Waveform_Generator/Waveform_Generator.ino
new file mode 100644
index 0000000..d6a80b5
--- /dev/null
+++ b/examples/Waveform_Generator/Waveform_Generator.ino
@@ -0,0 +1,121 @@
+// This example generates different waveforms based on user input on A12/DAC1.
+
+#include "AdvancedDAC.h"
+
+#define N_SAMPLES           (256)
+#define DEFAULT_FREQUENCY   (16000)
+
+AdvancedDAC dac1(A12);
+uint8_t SAMPLES_BUFFER[N_SAMPLES];
+size_t dac_frequency = DEFAULT_FREQUENCY;
+
+void generate_waveform(int cmd) 
+{   
+    switch (cmd) {
+        case 't':
+            // Triangle wave
+            Serial.print("Waveform: Triangle ");
+            for (int i=0; i<N_SAMPLES; i++){
+                SAMPLES_BUFFER[i] = abs((i % 255) - 127);
+            }
+            break;
+
+        case 'q':
+            // Square wave
+            Serial.print("Waveform: Square ");
+            for (int i=0; i<N_SAMPLES; i++){
+                SAMPLES_BUFFER[i] = (i % 255) < 127 ? 127 : 0;
+            }
+            break;
+
+        case 's':
+            // Sine wave
+            Serial.print("Waveform: Sine ");
+            for (int i=0; i<N_SAMPLES; i++){
+                SAMPLES_BUFFER[i] = sin(2 * 3.14 * (i / (float) N_SAMPLES)) * 127 + 127;
+            }
+            break;
+
+        case 'r':
+            // Sawtooth
+            Serial.print("Waveform: Sawtooth");
+            for (int i=0; i<N_SAMPLES; i++){
+                SAMPLES_BUFFER[i] = i;
+            }
+            break;
+
+        case '+':
+        case '-':
+            Serial.print("Current frequency: ");
+            
+            if (cmd == '+' && dac_frequency < 64000) {
+              dac_frequency *= 2;
+            } else if (cmd == '-' && dac_frequency > 1000) {
+              dac_frequency /= 2;
+            } else {
+              break;
+            }
+            
+            dac1.stop();
+            delay(500);
+            if (!dac1.begin(AN_RESOLUTION_8, dac_frequency * N_SAMPLES, N_SAMPLES, 32)) {
+              Serial.println("Failed to start DAC1 !");
+            }
+            delay(500);
+            break;
+            
+        default:
+            Serial.print("Unknown command ");
+            Serial.println((char) cmd);
+            return;
+    }
+    
+    Serial.print(dac_frequency/1000);
+    Serial.println("KHz");
+}
+
+void setup() {
+    Serial.begin(115200);
+
+    while (!Serial) {
+
+    }
+
+    
+    Serial.println("Enter a command:");
+    Serial.println("t: Triangle wave");
+    Serial.println("q: Square wave");
+    Serial.println("s: Sine wave");
+    Serial.println("r: Sawtooth wave");
+    Serial.println("+: Increase frequency");
+    Serial.println("-: Decrease frequency");
+    
+    generate_waveform('s');
+    
+    // DAC initialization
+    if (!dac1.begin(AN_RESOLUTION_8, DEFAULT_FREQUENCY * N_SAMPLES, N_SAMPLES, 32)) {
+        Serial.println("Failed to start DAC1 !");
+        while (1);
+    }
+}
+
+void loop() {
+    if (Serial.available() > 0) {
+        int cmd = Serial.read();
+        if (cmd != '\n') {
+          generate_waveform(cmd);
+        }
+    } 
+    
+    if (dac1.available()) {
+        // Get a free buffer for writing.
+        SampleBuffer buf = dac1.dequeue();
+
+        // Write data to buffer.
+        for (size_t i=0; i<buf.size(); i++) {
+            buf[i] =  SAMPLES_BUFFER[i];
+        }
+
+        dac1.write(buf);
+    }
+}