2017年12月31日 星期日

自己的喇叭自己做

一直想要有一台自製的藍芽喇叭,在家搞了一天,終於成功了,效果也非常的棒



所需零件:

(1)藍芽晶片: BK8000L

(2)功率放大器:  Yamaha YDA-138



下面是製作過程,看圖說故事不多說廢話










2017年12月17日 星期日

用ESP8266(ESP-01)上傳溫濕度資料到ThingSpeak

之前有利用Arduino UNO + ESP8266 做過同樣的功能,但其實ESP8266是很強悍的晶片,能完全取代Arduino UNO的功能,小小的一片晶片不但體積縮小,也比較省電,接下來就看圖說故事,不多作解釋

<只需要esp01 就可以運作,不再需要Arduino的板子>


<USB to FTDI只是為了燒錄程式到ESP01, 燒錄成功後可以拆下來,記得燒錄時GPIO 0 必須接到GND>

<在Arduino IDE ,開發板記得選ESP8266,序列阜也要選FTDI的那個 port>



<都沒問題的話,從 ThingSpeak就可以看到上傳的資料>

Assembly List

LabelPart TypeProperties
DHT1DHT11 Humitidy and Temperature Sensor
LED1Red (633nm) LED套件 1206 [SMD]; 顏色 Red (633nm)
R1220Ω Resistor接腳間隔 400 mil; 套件 THT; bands 4; tolerance ±5%; 電阻 220Ω
U1ESP8266 WiFi Modulevariant variant 1; part number ESP8266
元件1FTDI Basic Programmer類型 Basic; 電壓 5V


程式碼

#include "ESP8266WiFi.h"
#include <dht11.h>
dht11 DHT11;
#define LED 0 


const char* ssid = "ssid";
const char* password = "wifipassword";
const byte dataPin = 2;
const char* host = "api.thingspeak.com";


void setup() {
  // put your setup code here, to run once:
  pinMode(0,OUTPUT);
  Serial.begin(115200);
  
  WiFi.begin(ssid,password);
  
  while (WiFi.status() != WL_CONNECTED) {
    
    delay(500);
    Serial.print(".");
  }

  digitalWrite(LED,HIGH);
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println(WiFi.localIP());
 

}

void loop() {
  int chk = DHT11.read(dataPin);
  
  // put your main code here, to run repeatedly:
  Serial.print("Connecting to  " );
  Serial.println(host);
  // usage WiFiClient
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection fialed");
    return;
  }
  client.print(String("GET /") + "update?api_key=thingspeakapikey=" + String(DHT11.temperature) + "&field2=" + String(DHT11.humidity) + "\r\n\r\n");
  Serial.println("溫度:"+String(DHT11.temperature)+" ===  "+"濕度: "+String(DHT11.humidity));
  
  
  delay(100);
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
    for (int i=1 ; i<12; i++) {
      digitalWrite(LED,HIGH);
      delay(300);
      digitalWrite(LED,LOW);
      delay(300);
      digitalWrite(LED,HIGH);
    }
  }
  Serial.println();
  Serial.println("closing connection");
  delay(300000);
}

2017年12月16日 星期六

Arduino + DS3231 可調整時間的電子鐘



Assembly List

LabelPart TypeProperties
Grove1Grove 4 Digit Display大小 1x1; interface digital; variant variant 4
R210kΩ Resistor電阻 10kΩ; 套件 THT; tolerance ±5%; bands 4; 接腳間隔 400 mil
R310kΩ Resistor電阻 10kΩ; 套件 THT; tolerance ±5%; bands 4; 接腳間隔 400 mil
S1Momentary Switch套件 ksa_sealed_tac_switch; variant ksa_sealed
S2Momentary Switch套件 ksa_sealed_tac_switch; variant ksa_sealed
ZS-042 RTC1ZS-042 RTC Modulechip DS3231; variant variant 4
元件1Arduino Nano (Rev3.0)類型 Arduino Nano (3.0)



程式碼

#include <TimerOne.h>
#include "TM1637.h"
#include <Wire.h>
#include "RTClib.h"

#define CLK 8//pins definitions for TM1637 and can be changed to other ports    
#define DIO 7
#define ON 1
#define OFF 0
#define SW1 2
#define SW2 3


int ADJhour=0 ;
int ADJminute = 0;

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;

volatile int UPDATE ;
TM1637 tm1637(CLK,DIO);
RTC_DS3231 rtc;




void setup() {
  //
  pinMode(SW1, INPUT);
  pinMode(SW2, INPUT);
  
  //
  Timer1.initialize(500000);//timing for 500ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR
  //
  
  Serial.begin(9600);
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  //
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  
  
  // put your setup code here, to run once:

  
  
}

void loop() {
  // put your main code here, to run repeatedly:
   
   
  if (UPDATE == ON) {
    DispTime();
  
  }
  
  //ADJ HOUR
  if (digitalRead(SW1)) {
    ADJhour ++ ;
    if (ADJhour > 23) {
      ADJhour = 0;
    }
    ADJminute = (TimeDisp[2]*10) + TimeDisp[3];
    //Serial.print(ADJhour);
    //Serial.print(":");
    //Serial.println(ADJminute);
    //
    TimeDisp[0] = ADJhour/10 ;
    TimeDisp[1] = ADJhour%10;
    //
    tm1637.display(TimeDisp);
    rtc.adjust(DateTime(2014, 1, 21, ADJhour, ADJminute, 0));
    delay(150);
    
  }

  //ADJ Minute
  if (digitalRead(SW2)) {
    ADJminute ++ ;
    if (ADJminute > 59) {
      ADJminute = 0;
    }
    ADJhour = (TimeDisp[0]*10) + TimeDisp[1];
    TimeDisp[2] = ADJminute/10;
    TimeDisp[3] = ADJminute%10;
    //
    //Serial.print(ADJhour);
    //Serial.print(":");
    //Serial.println(ADJminute);
    //
    tm1637.display(TimeDisp);
    rtc.adjust(DateTime(2014, 1, 21, ADJhour, ADJminute, 0));
    delay(150);
  }
  


}

void TimingISR() {
  UPDATE = ON;
  
  
}

void DispTime() {
    DateTime now = rtc.now();
    ClockPoint = (~ClockPoint) & 0x01;
    if(ClockPoint)tm1637.point(POINT_ON);
    else tm1637.point(POINT_OFF); 

    TimeDisp[0] = now.hour()/10;
    TimeDisp[1] = now.hour()%10;
    TimeDisp[2] = now.minute()/10;
    TimeDisp[3] = now.minute()%10;
    
    
    tm1637.display(TimeDisp);
    UPDATE = OFF ;
  
}