+// Simple, low cost tone generator based on the AD9833 module. 4(6)-button control
+// Memory 1 (long press set)
+// Memory 2 (long press set)
+// Frequency Down (long press tone on/off)
+// Frequency Up (long press frequency reset to 1Khz)
+// Range Change 1hz 10hz 100hz 1k, 10k, 100k (long press reset to 1k)
+// Output Type SIN TRIANGLE SQUARE
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"
// 0X3C+SA0 - 0x3C or 0x3D
// spi code for the AD9833 from here http://www.vwlowen.co.uk/arduino/AD9833-waveform-generator/AD9833-waveform-generator.htm
#define SINE 0x2000 // Define AD9833's waveform register value.
#define SQUARE 0x2028 // When we update the frequency, we need to
-#define TRIANGLE 0x2002 // define the waveform when we end writing.
+#define TRIANGLE 0x2002 // define the waveform as well.
#define REF__FREQ 25000000.0 // On-board crystal reference frequency
#define FREQ_UP_PIN 6 // long press=reset to 1000hz
#define RANGE_PIN 7 // long press=reset to 1khz range
-unsigned long freq = 1000L; // Set initial frequency.
-unsigned long range = 1000; // Set initial step
+#define UPDATE_DELAY 3000 // 3 seconds to any storage of changes
+OneButton m1Button(M1_PIN, true);
+OneButton m2Button(M2_PIN, true);
OneButton upButton(FREQ_UP_PIN, true);
OneButton rangeButton(RANGE_PIN, true);
OneButton downButton(FREQ_DOWN_PIN, true);
OneButton waveButton(WAVE_PIN, true);
+ myMillis=millis()+UPDATE_DELAY;
+ if ((updateValues==1) && (myMillis<millis()))
+ if (eeSave.check != 0x52c3)
+ eeSave.waveType = SINE;
+ eeSave.m1_waveType = SINE;
+ eeSave.m1_freq = 1000L;
+ eeSave.m2_waveType = SINE;
+ eeSave.m2_freq = 1000L;
oled.begin(&Adafruit128x32, I2C_ADDRESS);
oled.setFont(Adafruit5x7);
pinMode(FREQ_DOWN_PIN, INPUT_PULLUP); // internal pullup resistors.
pinMode(RANGE_PIN, INPUT_PULLUP);
pinMode(WAVE_PIN, INPUT_PULLUP);
- AD9833setFrequency(freq, waveType);
- upButton.attachClick(clickUp);
- downButton.attachClick(clickDown);
- upButton.attachLongPressStart(longPressUp);
- waveButton.attachClick(clickWave);
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ m1Button.attachClick(useM1);
+ m1Button.attachLongPressStart(setM1);
+ m2Button.attachClick(useM2);
+ m2Button.attachLongPressStart(setM2);
+ upButton.attachClick(frequencyUp);
+ upButton.attachLongPressStart(frequencyReset);
+ downButton.attachClick(frequencyDown);
+ downButton.attachLongPressStart(beepToggle);
+ waveButton.attachClick(waveToggle);
rangeButton.attachClick(rangeSet);
rangeButton.attachLongPressStart(rangeReset);
- tone(BEEPER, 4400, 100);
- tone(BEEPER, 4600, 400);
+ tone(BEEPER, 4400, 100);
+ tone(BEEPER, 4600, 400);
+ tone(BEEPER, 4000, 80);
+ tone(BEEPER, 5000, 80);
+ switch (eeSave.waveType)
- case SINE: waveType = SQUARE; break;
- case SQUARE: waveType = TRIANGLE; break;
- case TRIANGLE: waveType = SINE; break;
- default: waveType = SINE; break;
+ case SINE: eeSave.waveType = SQUARE; break;
+ case SQUARE: eeSave.waveType = TRIANGLE; break;
+ case TRIANGLE: eeSave.waveType = SINE; break;
+ default: eeSave.waveType = SINE; break;
- AD9833setFrequency(freq, waveType);
- tone(BEEPER, 5000, 80);
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 5000, 80);
+ eeSave.freq=eeSave.m1_freq;
+ eeSave.waveType=eeSave.m1_waveType;
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 5000, 80);
+ eeSave.m1_freq=eeSave.freq;
+ eeSave.m1_waveType=eeSave.waveType;
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 4000, 80);
+ eeSave.freq=eeSave.m2_freq;
+ eeSave.waveType=eeSave.m2_waveType;
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 5000, 80);
+ eeSave.m2_freq=eeSave.freq;
+ eeSave.m2_waveType=eeSave.waveType;
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 4000, 80);
- if (freq < 4000000) freq += range; else freq = 4000000;
- AD9833setFrequency(freq, waveType);
- tone(BEEPER, 5000, 80);
+ if (eeSave.freq < 4000000L) eeSave.freq += eeSave.range; else eeSave.freq = 4000000L;
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 5000, 80);
- if (freq >= range) freq -= range; else freq = 1;
- AD9833setFrequency(freq, waveType);
- tone(BEEPER, 5000, 80);
+ if (eeSave.freq >= eeSave.range) eeSave.freq -= eeSave.range; else eeSave.freq = 1L;
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 5000, 80);
- AD9833setFrequency(freq, waveType);
- tone(BEEPER, 4500, 80);
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 4500, 80);
- case 1: range = 10; break;
- case 10: range = 100; break;
- case 100: range = 1000; break;
- case 1000: range = 10000; break;
- case 10000: range = 100000; break;
- case 100000: range = 1; break;
- default: range = 1000; break;
+ case 1: eeSave.range = 10L; break;
+ case 10: eeSave.range = 100L; break;
+ case 100: eeSave.range = 1000L; break;
+ case 1000: eeSave.range = 10000L; break;
+ case 10000: eeSave.range = 100000L; break;
+ case 100000: eeSave.range = 1L; break;
+ default: eeSave.range = 1000L; break;
- AD9833setFrequency(freq, waveType);
- tone(BEEPER, 5000, 80);
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 5000, 80);
- AD9833setFrequency(freq, waveType);
- tone(BEEPER, 4400, 600);
+ AD9833setFrequency(eeSave.freq, eeSave.waveType);
+ if (eeSave.beepOn) tone(BEEPER, 4400, 600);
// put your main code here, to run repeatedly:
// AD9833 documentation advises a 'Reset' on first applying power.
- sprintf(txt, "Freq: %d,%03d,%03dHz", uint16_t(freq / 1000000), uint16_t((freq % 1000000) / 1000), uint16_t(freq % 1000));
+ sprintf(txt, "Freq: %d,%03d,%03dHz", uint16_t(eeSave.freq / 1000000), uint16_t((eeSave.freq % 1000000) / 1000), uint16_t(eeSave.freq % 1000));
oled.setCursor(0, 3); oled.print("Range: ");
case 1: oled.print("1Hz"); break;
case 10: oled.print("10Hz"); break;
case 100000: oled.print("100KHz"); break;
+ switch (eeSave.waveType)
case SINE: oled.print("SIN"); break;
case TRIANGLE: oled.print("TRI"); break;
case SQUARE: oled.print("SQR"); break;