#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define Num_Samples 112
#define MaxWaveTypes 4
int i = 0;
int n = 0;
const int adcPin = 36;
int adcValue = 0;
byte wave_type=0;
static byte WaveFormTable[MaxWaveTypes][Num_Samples] = {
// Sin wave
{
0x80, 0x83, 0x87, 0x8A, 0x8E, 0x91, 0x95, 0x98, 0x9B, 0x9E, 0xA2, 0xA5, 0xA7, 0xAA, 0xAD, 0xAF,
0xB2, 0xB4, 0xB6, 0xB8, 0xB9, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xBF, 0xBF, 0xC0, 0xBF, 0xBF, 0xBF,
0xBE, 0xBD, 0xBC, 0xBB, 0xB9, 0xB8, 0xB6, 0xB4, 0xB2, 0xAF, 0xAD, 0xAA, 0xA7, 0xA5, 0xA2, 0x9E,
0x9B, 0x98, 0x95, 0x91, 0x8E, 0x8A, 0x87, 0x83, 0x80, 0x7C, 0x78, 0x75, 0x71, 0x6E, 0x6A, 0x67,
0x64, 0x61, 0x5D, 0x5A, 0x58, 0x55, 0x52, 0x50, 0x4D, 0x4B, 0x49, 0x47, 0x46, 0x44, 0x43, 0x42,
0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x49, 0x4B,
0x4D, 0x50, 0x52, 0x55, 0x58, 0x5A, 0x5D, 0x61, 0x64, 0x67, 0x6A, 0x6E, 0x71, 0x75, 0x78, 0x7C
},
// Triangular wave
{
0x80, 0x84, 0x89, 0x8D, 0x92, 0x96, 0x9B, 0x9F, 0xA4, 0xA8, 0xAD, 0xB2, 0xB6, 0xBB, 0xBF, 0xC4,
0xC8, 0xCD, 0xD1, 0xD6, 0xDB, 0xDF, 0xE4, 0xE8, 0xED, 0xF1, 0xF6, 0xFA, 0xFF, 0xFA, 0xF6, 0xF1,
0xED, 0xE8, 0xE4, 0xDF, 0xDB, 0xD6, 0xD1, 0xCD, 0xC8, 0xC4, 0xBF, 0xBB, 0xB6, 0xB2, 0xAD, 0xA8,
0xA4, 0x9F, 0x9B, 0x96, 0x92, 0x8D, 0x89, 0x84, 0x7F, 0x7B, 0x76, 0x72, 0x6D, 0x69, 0x64, 0x60,
0x5B, 0x57, 0x52, 0x4D, 0x49, 0x44, 0x40, 0x3B, 0x37, 0x32, 0x2E, 0x29, 0x24, 0x20, 0x1B, 0x17,
0x12, 0x0E, 0x09, 0x05, 0x00, 0x05, 0x09, 0x0E, 0x12, 0x17, 0x1B, 0x20, 0x24, 0x29, 0x2E, 0x32,
0x37, 0x3B, 0x40, 0x44, 0x49, 0x4D, 0x52, 0x57, 0x5B, 0x60, 0x64, 0x69, 0x6D, 0x72, 0x76, 0x7B
},
// Sawtooth wave
{
0x00, 0x02, 0x04, 0x06, 0x09, 0x0B, 0x0D, 0x10, 0x12, 0x14, 0x16, 0x19, 0x1B, 0x1D, 0x20, 0x22,
0x24, 0x27, 0x29, 0x2B, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x39, 0x3B, 0x3E, 0x40, 0x42, 0x44, 0x47,
0x49, 0x4B, 0x4E, 0x50, 0x52, 0x54, 0x57, 0x59, 0x5B, 0x5E, 0x60, 0x62, 0x65, 0x67, 0x69, 0x6B,
0x6E, 0x70, 0x72, 0x75, 0x77, 0x79, 0x7C, 0x7E, 0x80, 0x82, 0x85, 0x87, 0x89, 0x8C, 0x8E, 0x90,
0x93, 0x95, 0x97, 0x99, 0x9C, 0x9E, 0xA0, 0xA3, 0xA5, 0xA7, 0xA9, 0xAC, 0xAE, 0xB0, 0xB3, 0xB5,
0xB7, 0xBA, 0xBC, 0xBE, 0xC0, 0xC3, 0xC5, 0xC7, 0xCA, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD7, 0xDA,
0xDC, 0xDE, 0xE1, 0xE3, 0xE5, 0xE8, 0xEA, 0xEC, 0xEE, 0xF1, 0xF3, 0xF5, 0xF8, 0xFA, 0xFC, 0xFE
},
// Square wave
{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}
};
#define SW1 16
#define SW2 17
#define SWMode 19
#define LED 25
#define OnboardLED 2
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
long lasttime1sec = 0;
long lasttime500ms = 0;
int sectime = 0;
int mintime = 0;
char tempstring[100];
bool toogle = true;
const int ledPin = 25;
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
int firstDAC = 0;
int firstPWM = 0;
int pwmdata = 0;
bool modeclock = true;
bool modeAnalogout = true;
bool modePWMout = true;
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
}
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
pinMode(SWMode, INPUT);
//display.display();
delay(2000);
display.clearDisplay();
// Test Draw Char
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(F("HELLO"));
display.setCursor(0, 15);
display.println(F("ESP32"));
display.display();
delay(2000);
}
void loop() {
if(digitalRead(SWMode) == HIGH){
modeAnalogout = true; // PWM
}else{
modeAnalogout = false; // DAC
}
// DAC Mode
if(modeAnalogout == false){
// 1Loop
if(firstDAC == 0){
dacWrite(25, 0);
firstDAC = 1;
firstPWM = 0;
}
n++;
if(n >= 50){
i++;
n=0;
}
dacWrite(25, WaveFormTable[wave_type][i]);
if (i >= Num_Samples) i = 0;
//adcValue = analogRead(adcPin);
Serial.printf("0, 255, %d\n", WaveFormTable[wave_type][i]);
if((digitalRead(SW1) == HIGH) && (digitalRead(SW2) == HIGH)){
wave_type = 0;
}else if((digitalRead(SW1) == HIGH) && (digitalRead(SW2) == LOW)){
wave_type = 1;
}else if((digitalRead(SW1) == LOW) && (digitalRead(SW2) == HIGH)){
wave_type = 2;
}else if((digitalRead(SW1) == LOW) && (digitalRead(SW2) == LOW)){
wave_type = 3;
}
}else{ // PWM
if(firstPWM == 0){
ledcSetup(ledChannel, freq, resolution);
ledcAttachPin(ledPin, ledChannel);
firstPWM = 1;
firstDAC = 0;
}
if(modePWMout == true){
n++;
if(n >= 50){
i++;
n=0;
}
if(i>255){
i = 0;
}
ledcWrite(ledChannel, i );
Serial.printf("0, 255, %d\n", i);
}else{
n++;
if(n >= 50){
i--;
n=0;
}
if(i<0){
i = 255;
}
ledcWrite(ledChannel, i );
Serial.printf("0, 255, %d\n", i);
}
if(digitalRead(SW1) == LOW){
modePWMout = true;
}
if(digitalRead(SW2) == LOW){
modePWMout = false;
}
}
if (millis() - lasttime1sec >= 1000) {
lasttime1sec = millis();
if(modeclock == true){
sectime++;
if (sectime >= 60) {
sectime = 0;
mintime++;
if (mintime >= 60) {
mintime = 0;
}
}
}
}
if (millis() - lasttime500ms >= 500) {
lasttime500ms = millis();
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
if ((toogle == true) && (modeAnalogout==false)) {
sprintf(tempstring, "Time %02d:%02d DAC", mintime, sectime);
display.print(tempstring);
display.setCursor(0, 20);
sprintf(tempstring, "Data: %04d", WaveFormTable[wave_type][i]);
display.print(tempstring);
display.setCursor(0, 30);
if(wave_type == 0){
sprintf(tempstring, "Sine: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}else if(wave_type == 1){
sprintf(tempstring, "Trangle: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}else if(wave_type == 2){
sprintf(tempstring, "Sawtooth: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}else if(wave_type == 3){
sprintf(tempstring, "Square: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}
display.print(tempstring);
display.display();
} else if ((toogle == false) && (modeAnalogout==false)){
sprintf(tempstring, "Time %02d %02d DAC", mintime, sectime);
display.print(tempstring);
display.setCursor(0, 20);
sprintf(tempstring, "Data: %04d", WaveFormTable[wave_type][i]);
display.print(tempstring);
display.setCursor(0, 30);
if(wave_type == 0){
sprintf(tempstring, "Sine: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}else if(wave_type == 1){
sprintf(tempstring, "Trangle: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}else if(wave_type == 2){
sprintf(tempstring, "Sawtooth: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}else if(wave_type == 3){
sprintf(tempstring, "Square: %.1f", ((WaveFormTable[wave_type][i])*3.3/255));
}
display.print(tempstring);
display.display();
} else if ((toogle == true) && (modeAnalogout=true)){
sprintf(tempstring, "Time %02d:%02d PWM", mintime, sectime);
display.print(tempstring);
display.setCursor(0, 20);
sprintf(tempstring, "Data: %04d", i);
display.print(tempstring);
display.setCursor(0, 30);
if(modePWMout == true){
sprintf(tempstring, "UP: %.1f", (i *3.3/255));
}else{
sprintf(tempstring, "DW: %.1f", (i *3.3/255));
}
display.print(tempstring);
display.display();
}else if ((toogle == false) && (modeAnalogout=true)){
sprintf(tempstring, "Time %02d %02d PWM", mintime, sectime);
display.print(tempstring);
display.setCursor(0, 20);
sprintf(tempstring, "Data: %04d", i);
display.print(tempstring);
display.setCursor(0, 30);
if(modePWMout == true){
sprintf(tempstring, "UP: %.1f", (i *3.3/255));
}else{
sprintf(tempstring, "DW: %.1f", (i *3.3/255));
}
display.print(tempstring);
display.display();
}
toogle = !toogle;
}
}