參考資料:
維基百科:zh.wikipedia.org/zh-tw/%E9%93%81%E7%A3%81%E6%B5%81%E4%BD%93
臺灣網路科教館:www.ntsec.edu.tw/liveSupply/detail.aspx?a=6829&cat=6844&p=1&lid=19958
#include <U8g2lib.h>
#include "TM1637.h"
#include <WiFiManager.h>
#include <WiFiClientSecure.h>
#include <WiFi.h>
#define CLK 19 //Set the CLK pin connection to the display
#define DIO 18 //Set the DIO pin connection to the display
#define ANALOG_PIN_0 32
const char* ntpServer = "time.google.com";
const long gmtOffset_sec = 28800; //台灣時區+8hr,28800=8*60*60
const int daylightOffset_sec = 0; //台灣無日光節約時間
TM1637 tm1637(CLK, DIO); //set up the 4-Digit Display.
int numCounter = 0;
bool dian = false;
void setClock() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
}
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
return;
}
tm1637.display(0,timeinfo.tm_hour/10);
tm1637.display(1,timeinfo.tm_hour%10);
tm1637.display(2,timeinfo.tm_min/10);
tm1637.display(3,timeinfo.tm_min%10 );
tm1637.point(!dian);
WiFi.disconnect(true);
}
/********************OLED******************/
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0,U8X8_PIN_NONE);
const int WIDTH=128;
const int HEIGHT=32;
const int LENGTH=WIDTH;
int x;
int y[LENGTH];
void clearY(){
for(int i=0; i<LENGTH; i++){
y[i] = -1;
}
}
/***************波形图函数******************/
void drawY(){
u8g2.drawPixel(0, y[0]);
for(int i=1; i<LENGTH; i++){
if(y[i]!=-1){
//u8g.drawPixel(i, y[i]);
u8g2.drawLine(i-1, y[i-1], i, y[i]);
}else{
break;
}
}
}
void setup(){
Serial.begin(115200);
tm1637.init();
tm1637.point(1); //打開時鐘點
tm1637.set(BRIGHT_TYPICAL);
pinMode(ANALOG_PIN_0,INPUT_PULLUP); //設定ADC腳位
/********PWM配置**************/
ledcSetup(0,5000,8);
ledcAttachPin(2,0);
/***********OLED***************/
u8g2.begin();
u8g2.enableUTF8Print();
x = 0;
clearY();
/**************************/
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_unifont_t_chinese2); // 使用中文字型
u8g2.setCursor(0, 20);
u8g2.print("咖啡虫磁流体音箱");
u8g2.sendBuffer();
delay(1000);
u8g2.clearBuffer();
u8g2.drawStr(0,20,"SSID:CW_Speaker"); // 顯示SSID名稱
u8g2.sendBuffer();
/*******************WiFiManager初始化*****************/
WiFiManager wifiManager;
wifiManager.setTimeout(180);
//第一個參數是SSID的名稱,第二個參數是密碼
if(!wifiManager.autoConnect("CW_Speaker","12345678")) {
Serial.println("failed to connect and hit timeout");
delay(3000);
ESP.restart();
delay(5000);
}
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
setClock();
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);//关闭网络
Serial.println("WiFi disconnected!");
}
void loop() {
/***********讀取類比訊號*********************/
int analog_value = 0;
analog_value = analogRead(ANALOG_PIN_0);
Serial.println(analog_value);
/*******OLED波形顯示******************/
y[x] = map(analog_value, 0, 4095, HEIGHT-1, 0);
Serial.write(y[x]);
u8g2.firstPage();
do {
drawY();
} while( u8g2.nextPage() );
x++;
if(x >= WIDTH){
x = 0;
clearY();
}
int PWM = map(analog_value,0,4095,0,255); //這行是轉換ADC波的信號到L298N的PWM強度
digitalWrite(4,LOW);
digitalWrite(15,HIGH);
ledcWrite(0,PWM); //送出PWM
/*********顯示時間**************/
setClock();
}