#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <string.h>
#define SWMode 19
#define SW8 26
#define SW9 27
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define LEDpin 25
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8; // 0-255
int ramp = 0;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
bool Modetoogle = false;
hw_timer_t *timer01 = NULL;
#define Num_Samples 112
#define MaxWaveTypes 4
byte wave_type = 1;
int i = 0;
const int adcPin = 34;
int adcValue = 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
}
};
void IRAM_ATTR MODETicker(){
if(digitalRead(SWMode)==LOW){
Modetoogle=true;
ledcSetup(ledChannel, freq, resolution);
ledcAttachPin(LEDpin, ledChannel);
}else{
Modetoogle=false;
}
}
char timeOclockstring [100];
char DataValue [100];
char VoltValue [100];
int minus=0;
int sec = 0;
int realsec = 0;
void IRAM_ATTR timeOcolck(){
realsec++;
if(realsec>=2){
realsec=0;
sec++;
sprintf(timeOclockstring,"Time:%02d:%02d",minus,sec);
if(Modetoogle){
int dataCalcu = ramp*4095/255.0;
float voltCalcu= ramp*3.3/255.0;
sprintf(DataValue,"Data:%04d",dataCalcu);
sprintf(VoltValue,"Volt:%04.2fV",voltCalcu);
if(digitalRead(SW8)==LOW){
ledcWrite(ledChannel, ramp ); // analogWrite()
ramp++;
if(ramp>=256){
ramp = 0;
}
}
if(digitalRead(SW9)==LOW){
ledcWrite(ledChannel, ramp ); // analogWrite()
ramp--;
if(ramp<0){
ramp = 0;
}
}
}
}else{
sprintf(timeOclockstring,"Time:%02d %02d",minus,sec);
}
if(sec>=60){
sec =0;
minus++;
if(minus>=60) minus=0;
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
}
timer01 = timerBegin(0,80,true);
timerAttachInterrupt(timer01,&timeOcolck,true);
timerAlarmWrite(timer01,500000,true);
timerAlarmEnable(timer01);
pinMode(SWMode, INPUT_PULLUP);
pinMode(SW8, INPUT_PULLUP);
pinMode(SW9, INPUT_PULLUP);
if(digitalRead(SWMode)==LOW){
Modetoogle=true;
ledcSetup(ledChannel, freq, resolution);
ledcAttachPin(LEDpin, ledChannel);
}
else{
Modetoogle=false;
}
attachInterrupt(SWMode,MODETicker,CHANGE);
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
}
void loop() {
display.clearDisplay();
if(Modetoogle){
display.setCursor(0, 0);
display.printf("%s Mode:%s",timeOclockstring,"PMW");
display.setCursor(0, 10);
display.printf("%s",DataValue);
display.setCursor(0, 20);
display.printf("%s",VoltValue);
}else{
display.setCursor(0, 0);
display.printf("%s Mode:%s",timeOclockstring,"DAC");
if((digitalRead(SW8)==LOW) && (digitalRead(SW9)==LOW)){
wave_type=3;
}else if((digitalRead(SW8)==LOW) && (digitalRead(SW9)==HIGH)){
wave_type=2;
}else if((digitalRead(SW8)==HIGH) && (digitalRead(SW9)==LOW)){
wave_type=1;
}else if((digitalRead(SW8)==HIGH) && (digitalRead(SW9)==HIGH)){
wave_type=0;
}
dacWrite(25, WaveFormTable[wave_type][i]);
i++;
if (i >= Num_Samples) i = 0;
adcValue = analogRead(adcPin);
display.setCursor(0, 10);
sprintf(DataValue,"Data:%04d",adcValue);
display.printf("%s",DataValue);
float voltCalcu= adcValue*3.3/4095;
display.setCursor(0, 20);
sprintf(VoltValue,"Volt:%04.2fV",voltCalcu);
display.printf("%s",VoltValue);
Serial.printf("0, 255, %d\n", WaveFormTable[wave_type][i]);
}
display.display();
}