แสดงบทความที่มีป้ายกำกับ arduino แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ arduino แสดงบทความทั้งหมด

วันศุกร์ที่ 3 กรกฎาคม พ.ศ. 2558

บอร์ดเล่นเพลง mp3 ที่ใช้ชิป VS1053 นี้ค่อยข้างใช้งานได้ง่าย เนื่องจากมีผู้พัฒนา library ให้เรียบร้อยแล้ว การใช้งานนี้ไม่สอนหลักการอะไรมากนะครับ แค่ใช้งานมันได้ก็พอแล้วครับ
หลัก ๆ คำสั่งที่ใช้งานก็จะ เช่น
MP3player.isPlaying()        //  ดูว่าเพลงกำลังเล่นอยู่ไหม
MP3player.setMonoMode(1);    //  1=EnableMono, 0=DisableMono
MP3player.stopTrack();       //  หยุดเล่น
MP3player.pauseMusic();      //  หยุด
MP3player.resumeMusic();     //  เล่นต่อ
MP3player.resumeMusic(2000); //
MP3player.playTrack(ลำดับเพลง);//เล่นเพลง
มีอีกเยอะนะครับ ศึกษาเพิ่มเติมได้ที่
http://mpflaga.github.io/Sparkfun-MP3-Player-Shield-Arduino-Library/class_s_f_e_m_p3_shield.html


ตัวบอร์ดรองรับ 

Features

  • Can play a variety of music formats, support for OGG encoding real-time recording
  • SPI interface, the control signal lines are led out
  • A headphone and stereo output
  • A microphone for recording
  • A line_in input interface
  • Power indicator
  • 3.3V and 2.8V of LDO chip AMS-1117 on board, provides up to 800mA current
  • A single power supply: +5 VDC
  • 12.288 Mhz crystal
  • TF card slot

Decodes formats

  • Ogg Vorbis
  • MP3 = MPEG 1 & 2 audio layer III (CBR+VBR+ABR)
  • MP1 & MP2 = MPEG 1 & 2 audio layers I & II optional
  • MPEG4 / 2 AAC-LC(+PNS), HE-AAC v2 (Level 3) (SBR + PS)
  • WMA4.0/4.1/7/8/9 all profiles (5-384 kbps)
  • FLAC lossless audio with software plugin (upto 24 bits, 48 kHz)
  • WAV (PCM + IMA ADPCM)
  • General MIDI 1 / SP-MIDI format 0

Encodes formats from mic/line

  • Ogg Vorbis with software plugin
  • IMA ADPCM
  • 16-bit PCM

Document


VS1053-sch.jpg
Wring ของบอร์ด กับ arduino uno
ผมลองล่ะ Micro Sd card 4gb ใช้งานได้ 16gb ก็น่าจะได้ไม่ลอง ลองดูนะครับ อิอิอิ
สำหรับตัว library สามารถโหลดได้จากเว็ปนี้เลยนะครับ
http://www.geeetech.com/wiki/index.php/File:MP3-TF.zip

ซึ่งใช้กับ arduino รุ่น 1.0.5 R2 ได้ปกติ คือรุ่น1.0.X ใช้งานได้ครับ
พวกรุ่น 1.5.x มันจะมี error: variable 'bitrate_table' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM uint16_t bitrate_table[15][6] = {
                                     ^
Error compiling.

เหมือน avr-gcc ไม่รองรับอะไรซะอย่างนี่แหละ อย่างรู้เพิ่มเติมลองหาให้อากูดูครับ แหะๆ 

สำหรับโค้ด ก็ตามนี่ครับ 
/**************************************
*
*  Example for Sparkfun MP3 Shield Library
*      By: Bill Porter
*      www.billporter.info
*
*   Function:
*      This sketch listens for commands from a serial terminal (like the Serial Monitor in 
*      the Arduino IDE). If it sees 1-9 it will try to play an MP3 file named track00x.mp3
*      where x is a number from 1 to 9. For eaxmple, pressing 2 will play 'track002.mp3'.
*      A lowe case 's' will stop playing the mp3.
*      'f' will play an MP3 by calling it by it's filename as opposed to a track number. 
*
*      Sketch assumes you have MP3 files with filenames like 
*      "track001.mp3", "track002.mp3", etc on an SD card loaded into the shield. 
*
***************************************/

#include

//Add the SdFat Libraries
#include
#include  

//and the MP3 Shield Library
#include

//create and name the library object
SFEMP3Shield MP3player;
SdFat sd;
SdFile file;

byte temp;
byte result;

char title[30];
char artist[30];
char album[30];


void setup() {

  Serial.begin(115200);
  
   result = sd.begin(SD_SEL, SPI_HALF_SPEED);
  
  //boot up the MP3 Player Shield
  result = MP3player.begin();
  //check result, see readme for error codes.
  if(result != 0) {
    Serial.print("Error code: ");
    Serial.print(result);
    Serial.println(" when trying to start MP3 player");
    }

  Serial.println("Hello");
  Serial.println("Send a number 1-9 to play a track or s to stop playing");
  
}

void loop() {
  
  if(Serial.available()){
    temp = Serial.read();
    
    Serial.print("Received command: ");
    Serial.write(temp);
    Serial.println(" ");
    
    //if s, stop the current track
    if (temp == 's') {
      MP3player.stopTrack();
    }
      
    else if (temp >= '1' && temp <= '9'){
      //convert ascii numbers to real numbers
      temp = temp - 48;
      
      //tell the MP3 Shield to play a track
      result = MP3player.playTrack(temp);
      
      //check result, see readme for error codes.
      if(result != 0) {
        Serial.print("Error code: ");
        Serial.print(result);
        Serial.println(" when trying to play track");
        }
      
      Serial.println("Playing:");
      
      //we can get track info by using the following functions and arguments
      //the functions will extract the requested information, and put it in the array we pass in  
      MP3player.trackTitle((char*)&title);
      MP3player.trackArtist((char*)&artist);
      MP3player.trackAlbum((char*)&album);
      
      //print out the arrays of track information
      Serial.write((byte*)&title, 30);
      Serial.println();
      Serial.print("by:  ");
      Serial.write((byte*)&artist, 30);
      Serial.println();
      Serial.print("Album:  ");
      Serial.write((byte*)&album, 30);
      Serial.println();
      
      }
    
    /* Alterativly, you could call a track by it's file name by using playMP3(filename); 
       But you must stick to 8.1 filenames, only 8 characters long, and 3 for the extension */
    
    else if (temp == 'f') {
      //create a string with the filename
      char trackName[] = "track001.mp3";
//      char trackName[] = "1.mp3";
      
      //tell the MP3 Shield to play that file
      result = MP3player.playMP3(trackName);
      
      //check result, see readme for error codes.
      if(result != 0) {
        Serial.print("Error code: ");
        Serial.print(result);
        Serial.println(" when trying to play track");
        }
      }
      
  }
  
  delay(100);
  
}

ลองเอาไปเล่นดูนะครับ มีติดปัญหาอะไรถามมาได้เลยนะครับ เพื่อช่วยท่านได้หรือป่าว 
ขอบคุณที่อ่านนะครับ บทความเขียนงงนิดหน่อยนะ ดึกๆแล้ว



วันอาทิตย์ที่ 26 ตุลาคม พ.ศ. 2557

Project พัดลมปรับความเร็วตามอุณหภูมิ + ควบคุมผ่าน Android

แนะนำความสามารถของพัดลมตัวนี้กันก่อนนะครับ 
สามารถทำงานได้ 3 โหมด คือ 1. Manual  2. Auto และ 3. Manual โดย Android Phone
ในโหมด Manual จะสามารถกดที่ปุ่มได้ปกติ เบอร์ 1 ความเร็วระดับ 1 ,เบอร์ 2 ความเร็วระดับ 2 และ เบอร์ 3 ความเร็วระดับ 3 เมื่อมีการกดเบอร์ 1 หรือ 2 หรือ 3 จะเข้าสู่โหมด Manual ทันที 
ในโหมด Auto  พัดลมจะปรับความเร็วตามอุณหภูมิ 
ความเร็วเบอร์ 0 อุหณภูมิน้อยกว่า 25 องศา 
ความเร็วเบอร์ 1 อุหณภูมิช่วง 25 - 28 องศา 
ความเร็วเบอร์ 2 อุณหภูมิช่วง 29 - 31 องศา 
ความเร็วเบอร์ 3 อุณหภูมิมากว่า 31 องศา
ในโหมด Manual ผ่าน Android Phone จะเชื่อมต่อกับพัดลมผ่านระบบ bluetooth hc-06 โดยเราได้เขียน application สำหรับควบคุมพัดลมตัวนี้ขึ้นมา จะสามารถดูอุณหภูมิและความเร็วมอเตอร์ผ่านตัว app ได้เลยพร้อมทั้งสามารถสั่งเปลี่ยนความเร็วผ่าน app android ได้เลย

อุปกรณ์ที่ใช้
1. บอร์ด arudino uno r3 สั่งซื้อ คลิก
2. bluetooth hc-06 สั่งซื้อ คลิก 
3. บอร์ด relay 4 channel สั่งซื้อ คลิก
4. LCD + I2C สั่งซื้อ คลิก
5. DHT11 สั่งซื้อ คลิก
6. พัดลมขนาด 12 นิ้ว



รายละเอียดอุปกรณ์ที่ใช้


ตัวอย่างใช้งานโหมด Manual 
กดเบอร์ 1 ทีจอจะแสดง Manual Mode S=1

ตัวอย่างใช้งานในโหมด Auto 
อุณหภูมิอยู่ที่ 30 องศา เฉาะอยู่ในเงื่อนไขเบอร์ 2 ใน Auto Mode

ตัวอย่างการทำงานในโหมด Manual ผ่าน Android Phone

Manaul Speed = 2 อุณหภูมิ = 29 องศา

Manual Speed 3 อุณหภูมิ = 29 องศา

Manual ปิดพัดลม อุณหภูมิ = 29 องศา







วันนี้จะมาสอนใช้งาน Arduino Shield Ethernet W5100 แสดงค่าอุณหภูมิและความชื้น ภายในบ้าน
โดยผมใช้ sensor dht11 เป็นตัวอ่านค่าอุณหภูมิและความชื้น
มาดูวงจรแบบง่ายกันเลยครับ สำหรับการต่อ dht11
 
vcc ต่อ +5v
data ต่อ pin2
n/a ไม่ต้องต่อครับ
gnd ต่อ 0v

จากนั้นเสียบบอร์ด Arduino Shield Ethernet W5100 พร้อมสาย Lan ดังรูปด้านล่าง
โหลด Libary DHT จาก ลิ้งค์นี้
https://dl.dropboxusercontent.com/u/13758529/elec2you/DHT.rar นำไปวางไว้ใน Folder libary ของ Arduino ที่ใช้เขียนโปรแกรม 
 จากนั้นนำโค้ดนี้ upload ลง arduio เพื่อหา IP Address ก่อน 
#include "SPI.h"
#include "Ethernet.h"

 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 173,194,126,119  }; // www.google.co.th
 
EthernetClient client;
 
void setup()
{
  Serial.begin(9600);
  if(Ethernet.begin(mac) == 0) { // start ethernet using mac & DHCP
    Serial.println("Failed to configure Ethernet using DHCP");  
    while(true)   // no point in carrying on, so stay in endless loop:
      ;
  } 
  delay(1000); // give the Ethernet shield a second to initialize
  
  Serial.print("This IP address: ");
  IPAddress myIPAddress = Ethernet.localIP(); 
  Serial.print(myIPAddress);  
  if(client.connect(server, 80)>0) {
    Serial.println(" connected");
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}
 
void loop()
{
  if (client.available()) {
    char c = client.read();
    // uncomment the next line to show all the received characters   
    // Serial.print(c);
  }
 
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}

เมื่อได้ IP ดังรูป 
จากนั้นแก้ IP Address ใน Code ด้านล่างให้ตรงกับที่เรา FIND IP มา
 */

#include 
#include 
#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,100,146);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

 //IPAddress myIPAddress = Ethernet.localIP(); 
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  dht.begin();
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
  client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("");
          client.println("");
            
            client.print("WWW.ELEC2YOU.COM");
            client.println("
"); 
            client.print("Humidity: ");
            client.print(dht.readHumidity());
            client.print(" Temperature: ");
            client.print(dht.readTemperature());
            client.println("
");       
          
          client.println("");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}
upload ลง บอร์ด arduion uno r3