转载

1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版

需求描述

儿子有一堆充电玩具,基本上都是锂电池,经常插上去充电忘了到时拔下来,所以需要一块能设置接通时间的插板以保障电池的安全。

硬件设计:

首先需要一块插板,接着需要一个继电器,然后采用arduino r3 uno 加 一个时钟模块来控制时间,最后配一个蓝牙模块,通过手机进行时间的设定。

时钟模块:DS3231 AT24C32, 采用I2C链接arduino板上 ,SCL->A5,SDA->A4,VCC->VCC,GND->GND。

蓝牙模块:HC-06, 使用用arduino的软串口,RXT->9,TXD->8,VCC->VCC,GND->GND,后来发现这款没蓝牙链接,会一直有报警,不知道能不能关,声音不大,但是挺烦的。

继续电器:220V 10A,3个脚那种,将公共端与常开端连入220V电源。

Arduino: R3 Uno 板,发现45块的山寨,还没25块的山寨好用,啥情况。

电源模块: 220VAC -> 5VDC ,用的是精密431那款,不小心摔了2下居然还能用,太意外,这里要吐槽下淘宝上卖android外接电源适配器的,没一个好用的,

有一个刚插上就烧的,太无良了。

辅助材料:扎带,胶水,PC板(用的是聚碳酸脂板,耐火,diy的东西安全重要啊),各种型号螺丝。

使用工具:这个是消费的大头,电烙铁(第一次使用是大学那个无良的电子社团,收了28块钱,结果就叫我进去用电烙铁拆了2个电容就没有任何音讯了,哥记住你了。。。),

电转,加各类转头(直接买了个360的电转工具箱),钢钜(拿来切割PC板,后来发现这个是本项目里最难的,昨天淘宝里定了330的切割机)

  软件设计

 arduino端:主要是串口接收手机发来的命令,并返回,代码如下:

1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版
/* DS3231_test.pde Eric Ayars 4/11  Test/demo of read routines for a DS3231 RTC.  Turn on the serial monitor after loading this to check if things are working as they should.  */  #include <DS3231.h> #include <Wire.h> #include <EEPROM.h>  #define powerPin 7 DS3231 Clock;  String ReceivedCache=""; String BTime="2010-07-24 11:15:00"; String ETime="2010-07-24 11:15:00"; boolean isFire=false;  void setup() {       // Start the I2C interface        Wire.begin();        Clock.setClockMode(false);        Serial.begin(9600);        pinMode(powerPin,OUTPUT);        digitalWrite(powerPin,LOW);        Clock.turnOnAlarm(1);        RetrieveFireSet(); }   void loop() {     handleCmd();   checkFire(); }  void checkFire(){   String dateTime=GetTime();   if(dateTime>=BTime && dateTime<=ETime){     digitalWrite(powerPin,HIGH);      isFire=true;   }else{     digitalWrite(powerPin,LOW);      isFire=false;   } }  String formatNum(int a){   if(a<10)return  "0" +(String)a;   return (String)a; }  String GetTime(){   bool Century=false;   bool h12=false;   bool PM=false;     int second,minute,hour,date,month,year,temperature;      second=Clock.getSecond();     minute=Clock.getMinute();     hour=Clock.getHour(h12, PM);     date=Clock.getDate();     month=Clock.getMonth(Century);     year=Clock.getYear();          String dateTime="20" +formatNum(year) +"-"                       +formatNum(month) +"-"                      +formatNum(date) +" "                      +formatNum(hour) +":"                      +formatNum(minute)+":"                      +formatNum(second);    return dateTime; }  void handleGetTime(){       String dateTime=GetTime();     Serial.println("OK:"+dateTime);      } void handleSetTime(){      int second,minute,hour,date,month,year,dayOfWeek;    String dateTime=ReceivedCache.substring(5,24);      year  =dateTime.substring(2,4).toInt();   month  =dateTime.substring(5,7).toInt();   date=dateTime.substring(8,10).toInt();      hour=dateTime.substring(11,13).toInt();   minute=dateTime.substring(14,16).toInt();   second=dateTime.substring(17,19).toInt();   dayOfWeek=dateTime.substring(20,21).toInt();       Clock.setSecond(second);//Set the second        Clock.setMinute(minute);//Set the minute        Clock.setHour(hour);  //Set the hour        Clock.setDoW(dayOfWeek);    //Set the day of the week       Clock.setDate(date);  //Set the date of the month       Clock.setMonth(month);  //Set the month of the year       Clock.setYear(year);  //Set the year (Last two digits of the year)    Serial.println("OK:"); }  void handleGetFire(){   String tmp=_ReadFireSet();   if(tmp==""){    Serial.println("EE:fire time not set!");    }else{    Serial.println("OK:" + tmp);   } }  void handleSetFire(){       for(int address=0;address<43;address++){      EEPROM.write(address,(byte)ReceivedCache[address]);      //Serial.print((char)EEPROM.read(address));    }    //Serial.println("");    String bTime=ReceivedCache.substring(5,24);    String eTime=ReceivedCache.substring(24,43);    bool flag=RetrieveFireSet();   // Serial.println("flag:" + (String)flag);    if(flag && (bTime==BTime && eTime==ETime)){      Serial.println("OK:");     }else{      Serial.println("EE:Set Fail");     } }  String _ReadFireSet(){     int address=0;     String tmp="";     char readChar=' ';    for(int address=0;address<5;address++){      readChar=(char)EEPROM.read(address);      tmp +=readChar;   }     if(tmp!="SetF:"){     return "";   }      tmp="";    for(int address=5;address<43;address++){      readChar=(char)EEPROM.read(address);      tmp +=readChar;   }   //Serial.println(tmp);   return tmp; }  bool RetrieveFireSet(){    String tmp=_ReadFireSet();   if(tmp==""){     return false;   }else{    BTime=tmp.substring(0,19);    ETime=tmp.substring(19,38);    return true;   } }  //read Serial data and hand command // void handleCmd(){    char readChar=' ';        while(Serial.available()>0){       readChar=(char)Serial.read();        ReceivedCache =ReceivedCache+ (String)readChar;       //delayMicroseconds(10);    }    //Serial.println("ABC");   // Serial.println(ReceivedCache);    if(ReceivedCache.startsWith("GetT:")){      handleGetTime();      ReceivedCache=ReceivedCache.substring(5);          }else if(ReceivedCache.startsWith("SetT:")){      //like->SetT:2015-07-24 16:54:23,7      if(ReceivedCache.length()>=26){        handleSetTime();        ReceivedCache=ReceivedCache.substring(26);      }    }else if(ReceivedCache.startsWith("GetS:")){      Serial.println("OK:"+(String)isFire);      ReceivedCache=ReceivedCache.substring(5);    }else if(ReceivedCache.startsWith("GetF:")){      handleGetFire();      ReceivedCache=ReceivedCache.substring(5);    }else if(ReceivedCache.startsWith("SetF:")){      if(ReceivedCache.length()>=43){        handleSetFire();        ReceivedCache=ReceivedCache.substring(43);      }    }else if(ReceivedCache.startsWith("GetC:")){      int temperature=Clock.getTemperature();      Serial.println("OK:" +(String)temperature);      ReceivedCache=ReceivedCache.substring(5);    }    else{      if(ReceivedCache.length()>=5){         ReceivedCache="";       }    }        if(readChar=='/n')ReceivedCache=""; }
View Code

android 端:

蓝牙操作部分是参考官方提供的蓝牙串口聊天室,蓝牙操作跟socket差不多,有个蓝牙串口服务协议(程序里体现就一段GUID)用来识别蓝牙链接提供的服务类型,一个标识吧了。

主要代码:

1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版
package cn.fustudio.mangospile; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; public class BluetoothService {  // Debugging  private static final String TAG = "BluetoothService";  private static final boolean D = true;  // Name for the SDP record when creating server socket  private static final String NAME_SECURE = "BluetoothSecure";  private static final String NAME_INSECURE = "BluetoothInsecure";  // Unique UUID for this application  private static final UUID MY_UUID_SECURE =UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");   //UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");  private static final UUID MY_UUID_INSECURE =UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");   //UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");  // Member fields  private final BluetoothAdapter mAdapter;  private final Handler mHandler;  private ConnectThread mConnectThread;  private ConnectedThread mConnectedThread;  private int mState;  // Constants that indicate the current connection state  public static final int STATE_NONE = 0;    // we're doing nothing  public static final int STATE_LISTEN = 1;  // now listening for incoming connections  public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection  public static final int STATE_CONNECTED = 3;  // now connected to a remote device  public BluetoothService(Context context, Handler handler) {   //ff hh      mAdapter = BluetoothAdapter.getDefaultAdapter();      mState = STATE_NONE;      mHandler = handler;  }  /**   * Set the current state of the chat connection   * @param state  An integer defining the current connection state   */  private synchronized void setState(int state) {   if (D) Log.d(TAG, "setState() " + mState + " -> " + state);   mState = state;   // Give the new state to the Handler so the UI Activity can update   mHandler.obtainMessage(MainActivity.MESSAGE_STATE_CHANGE, state, -1).sendToTarget();  }  /**   * Return the current connection state. */  public synchronized int getState() {   return mState;  }  /**   * Start the chat service. Specifically start AcceptThread to begin a   * session in listening (server) mode. Called by the Activity onResume() */  public synchronized void start() {   if (D) Log.d(TAG, "start");   // Cancel any thread attempting to make a connection   if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}   // Cancel any thread currently running a connection   if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}   setState(STATE_LISTEN);  }  /**   * Start the ConnectThread to initiate a connection to a remote device.   * @param device  The BluetoothDevice to connect   * @param secure Socket Security type - Secure (true) , Insecure (false)   */  public synchronized void connect(BluetoothDevice device, boolean secure) {   if (D) Log.d(TAG, "connect to: " + device);   // Cancel any thread attempting to make a connection   if (mState == STATE_CONNECTING) {    if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}   }   // Cancel any thread currently running a connection   if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}   // Start the thread to connect with the given device   mConnectThread = new ConnectThread(device, secure);   mConnectThread.start();   setState(STATE_CONNECTING);  }  /**   * Start the ConnectedThread to begin managing a Bluetooth connection   * @param socket  The BluetoothSocket on which the connection was made   * @param device  The BluetoothDevice that has been connected   */  public synchronized void connected(BluetoothSocket socket, BluetoothDevice    device, final String socketType) {   if (D) Log.d(TAG, "connected, Socket Type:" + socketType);   // Cancel the thread that completed the connection   if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}   // Cancel any thread currently running a connection   if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}   // Start the thread to manage the connection and perform transmissions   mConnectedThread = new ConnectedThread(socket, socketType);   mConnectedThread.start();   // Send the name of the connected device back to the UI Activity   Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_DEVICE_NAME);   Bundle bundle = new Bundle();   bundle.putString(MainActivity.DEVICE_NAME, device.getName());   msg.setData(bundle);   mHandler.sendMessage(msg);   setState(STATE_CONNECTED);  }  /**   * Stop all threads   */  public synchronized void stop() {   if (D) Log.d(TAG, "stop");   if (mConnectThread != null) {    mConnectThread.cancel();    mConnectThread = null;   }   if (mConnectedThread != null) {    mConnectedThread.cancel();    mConnectedThread = null;   }   setState(STATE_NONE);  }  /**   * Write to the ConnectedThread in an unsynchronized manner   * @param out The bytes to write   * @see ConnectedThread#write(byte[])   */  public void write(byte[] out) {   // Create temporary object   ConnectedThread r;   // Synchronize a copy of the ConnectedThread   synchronized (this) {    if (mState != STATE_CONNECTED) return;    r = mConnectedThread;   }   // Perform the write unsynchronized   r.write(out);  }  /**   * Indicate that the connection attempt failed and notify the UI Activity.   */  private void connectionFailed() {   // Send a failure message back to the Activity   Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_TOAST);   Bundle bundle = new Bundle();   bundle.putString(MainActivity.TOAST, "Unable to connect device");   msg.setData(bundle);   mHandler.sendMessage(msg);   // Start the service over to restart listening mode   BluetoothService.this.start();  }  /**   * Indicate that the connection was lost and notify the UI Activity.   */  private void connectionLost() {   // Send a failure message back to the Activity   Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_TOAST);   Bundle bundle = new Bundle();   bundle.putString(MainActivity.TOAST, "Device connection was lost");   msg.setData(bundle);   mHandler.sendMessage(msg);   // Start the service over to restart listening mode   BluetoothService.this.start();  }  /**   * This thread runs while attempting to make an outgoing connection   * with a device. It runs straight through; the connection either   * succeeds or fails.   */  private class ConnectThread extends Thread {   private final BluetoothSocket mmSocket;   private final BluetoothDevice mmDevice;   private String mSocketType;   public ConnectThread(BluetoothDevice device, boolean secure) {    mmDevice = device;    BluetoothSocket tmp = null;    mSocketType = secure ? "Secure" : "Insecure";    // Get a BluetoothSocket for a connection with the    // given BluetoothDevice    try {     if (secure) {      tmp = device.createRfcommSocketToServiceRecord(        MY_UUID_SECURE);     } else {      tmp = device.createInsecureRfcommSocketToServiceRecord(        MY_UUID_INSECURE);     }    } catch (IOException e) {     Log.e(TAG, "Socket Type: " + mSocketType + "create() failed", e);    }    mmSocket = tmp;   }   public void run() {    Log.i(TAG, "BEGIN mConnectThread SocketType:" + mSocketType);    setName("ConnectThread" + mSocketType);    // Always cancel discovery because it will slow down a connection    mAdapter.cancelDiscovery();    // Make a connection to the BluetoothSocket    try {     // This is a blocking call and will only return on a     // successful connection or an exception     mmSocket.connect();    } catch (IOException e) {     // Close the socket     try {      mmSocket.close();     } catch (IOException e2) {      Log.e(TAG, "unable to close() " + mSocketType +        " socket during connection failure", e2);     }     connectionFailed();     return;    }    // Reset the ConnectThread because we're done    synchronized (BluetoothService.this) {     mConnectThread = null;    }    // Start the connected thread    connected(mmSocket, mmDevice, mSocketType);   }   public void cancel() {    try {     mmSocket.close();    } catch (IOException e) {     Log.e(TAG, "close() of connect " + mSocketType + " socket failed", e);    }   }  }  /**   * This thread runs during a connection with a remote device.   * It handles all incoming and outgoing transmissions.   */  private class ConnectedThread extends Thread {   private final BluetoothSocket mmSocket;   private final InputStream mmInStream;   private final OutputStream mmOutStream;   public ConnectedThread(BluetoothSocket socket, String socketType) {    Log.d(TAG, "create ConnectedThread: " + socketType);    mmSocket = socket;    InputStream tmpIn = null;    OutputStream tmpOut = null;    // Get the BluetoothSocket input and output streams    try {     tmpIn = socket.getInputStream();     tmpOut = socket.getOutputStream();    } catch (IOException e) {     Log.e(TAG, "temp sockets not created", e);    }    mmInStream = tmpIn;    mmOutStream = tmpOut;   }   public void run() {    Log.i(TAG, "BEGIN mConnectedThread");    byte[] buffer = new byte[1024];    int bytes;    String buffString="";    // Keep listening to the InputStream while connected    while (true) {     try {      // Read from the InputStream      bytes = mmInStream.read(buffer);      String msg=new String(buffer,0,bytes);      buffString +=msg;      int indexOfNewLine= buffString.indexOf("/n");      if(indexOfNewLine>=0){       String frameString= buffString.substring(0, indexOfNewLine+1);       buffString=buffString.substring(indexOfNewLine+1);          mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, frameString)          .sendToTarget();      }      if(buffString.length()>1024){       buffString="";      }      // Send the obtained bytes to the UI Activity //     mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer) //       .sendToTarget();           } catch (IOException e) {      Log.e(TAG, "disconnected", e);      connectionLost();      break;     }    }   }   /**    * Write to the connected OutStream.    * @param buffer  The bytes to write    */   public void write(byte[] buffer) {    try {     mmOutStream.write(buffer);     // Share the sent message back to the UI Activity     mHandler.obtainMessage(MainActivity.MESSAGE_WRITE, -1, -1, buffer)       .sendToTarget();    } catch (IOException e) {     Log.e(TAG, "Exception during write", e);    }   }   public void cancel() {    try {     mmSocket.close();    } catch (IOException e) {     Log.e(TAG, "close() of connect socket failed", e);    }   }  } } 
View Code
1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版
package cn.fustudio.mangospile; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import cn.fustudio.mangospile.CDateTimeChooseDialog.ICallback; import android.R.bool; import android.R.string; import android.app.Activity; import android.app.ActionBar; import android.app.Fragment; import android.app.ProgressDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.format.DateUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.os.Build; public class MainActivity extends Activity implements ICallback,OnClickListener {  // Debugging  private static final String TAG = "BluetoothChat";  private static final boolean D = true;  // Message types sent from the BluetoothChatService Handler  public static final int MESSAGE_STATE_CHANGE = 1;  public static final int MESSAGE_READ = 2;  public static final int MESSAGE_WRITE = 3;  public static final int MESSAGE_DEVICE_NAME = 4;  public static final int MESSAGE_TOAST = 5;  public static final int MESSAGE_SETF_ENABLE=6;  public static final int MESSAGE_SETT_ENABLE=7;  // Key names received from the BluetoothChatService Handler  public static final String DEVICE_NAME = "device_name";  public static final String TOAST = "toast";  // Intent request codes  private static final int REQUEST_CONNECT_DEVICE_SECURE = 1;  private static final int REQUEST_CONNECT_DEVICE_INSECURE = 2;  private static final int REQUEST_ENABLE_BT = 3;  private static final int CALLBACK_SETBTIME=1;  private static final int CALLBACK_SETETIME=2;  // Name of the connected device  private String mConnectedDeviceName = null;  // String buffer for outgoing messages  private StringBuffer mOutStringBuffer;  // Local Bluetooth adapter  private BluetoothAdapter mBluetoothAdapter = null;  // Member object for the chat services  private BluetoothService mService = null;  private Timer mTimer=new Timer();  private Button btnSyncTime=null;  private Button btnSetF=null;  private TextView txtTime=null;  private TextView txtBTime=null;  private TextView txtETime=null;  private TextView txtStatus=null;  private TextView txtTemperature=null;  private TextView txtTips=null;  private Date getFBTime=null;  private Date getFETime=null;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);   mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();   // If the adapter is null, then Bluetooth is not supported   if (mBluetoothAdapter == null) {    Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();    finish();    return;   }     init();  }  private void init(){   btnSyncTime=(Button)findViewById(R.id.btnSyncTime);   btnSyncTime.setOnClickListener(this);   btnSetF=(Button)findViewById(R.id.btnSetF);   btnSetF.setOnClickListener(this);   txtTime=(TextView)findViewById(R.id.txtTime);   txtBTime=(TextView)findViewById(R.id.txtBTime);   txtBTime.setOnClickListener(this);   txtETime=(TextView)findViewById(R.id.txtETime);   txtETime.setOnClickListener(this);   txtStatus=(TextView)findViewById(R.id.txtStatus);   txtTemperature=(TextView)findViewById(R.id.txtTemperature);   txtTips=(TextView)findViewById(R.id.txtTips);   }  /* Begin Upload file */  private ProgressDialog dialog;  @Override  public void onClick(View arg0) {   // TODO Auto-generated method stub   if(arg0.getId()==R.id.btnSyncTime){      syncTime();   }else if(arg0.getId()==R.id.btnSetF){       setF();   }else if(arg0.getId()==R.id.txtBTime){    String dString=txtBTime.getText().toString();    Date dateV= DateUtil.parse(dString,new Date());    new CDateTimeChooseDialog(this, CALLBACK_SETBTIME,"开始时间","确定", dateV, this).show();   }else if(arg0.getId()==R.id.txtETime) {    String dString=txtETime.getText().toString();    Date dateV= DateUtil.parse(dString,new Date());    new CDateTimeChooseDialog(this, CALLBACK_SETETIME,"结束时间","确定",  dateV, this).show();   }  }  private void setF(){    if(mService.getState()!=BluetoothService.STATE_CONNECTED){     Toast.makeText(this, "请先链接设备", Toast.LENGTH_LONG).show();     return;    }    String bTimeStr=txtBTime.getText().toString();    String eTimeStr=txtETime.getText().toString();    if("...".equals(bTimeStr) || "...".equals(eTimeStr)){     Toast.makeText(this, "请先输入开始结束时间", Toast.LENGTH_LONG).show();     return ;    }    Date bTime=null;    Date eTime=null;    try{     bTime=DateUtil.parse(bTimeStr);     eTime=DateUtil.parse(eTimeStr);    }catch(Exception e){     Toast.makeText(this, "时间字符解析错误", Toast.LENGTH_LONG).show();     return;    }    if(bTime.compareTo(eTime)>0){     Toast.makeText(this, "开始时间大于结束时间", Toast.LENGTH_LONG).show();     return ;    }    btnSetF.setEnabled(false);    String cmd="SetF:"+bTimeStr+eTimeStr ;    sendMessage(cmd);    dialog = ProgressDialog.show(MainActivity.this, null,      "执行命令...");    Timer timer=new Timer();    timer.schedule(new TimerTask() {     @Override     public void run() {      mHandler.obtainMessage(MESSAGE_SETF_ENABLE,"").sendToTarget();      // TODO Auto-generated method stub      if(dialog!=null){        dialog.dismiss();        dialog=null;      }     }    }, 2000);  }  private void syncTime() {    if(mService.getState()!=BluetoothService.STATE_CONNECTED){     Toast.makeText(this, "请先链接设备", Toast.LENGTH_LONG).show();     return;    }    btnSyncTime.setEnabled(false);    String cmd="SetT:"+DateUtil.formatLong(new Date())+"," +DateUtil.getWOfD(new Date());    sendMessage(cmd);    dialog = ProgressDialog.show(MainActivity.this, null,      "执行命令...");    Timer timer=new Timer();    timer.schedule(new TimerTask() {     @Override     public void run() {       mHandler.obtainMessage(MESSAGE_SETT_ENABLE,"").sendToTarget();      // TODO Auto-generated method stub      if(dialog!=null){        dialog.dismiss();        dialog=null;      }     }    }, 2000);  }  //========Activity Life Cir  @Override  public void onStart() {   super.onStart();   if(D) Log.e(TAG, "++ ON START ++");   // If BT is not on, request that it be enabled.   // setupChat() will then be called during onActivityResult   if (!mBluetoothAdapter.isEnabled()) {    Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);    startActivityForResult(enableIntent, REQUEST_ENABLE_BT);   // Otherwise, setup the chat session   } else {    if (mService == null) setupService();   }  }  @Override  public synchronized void onResume() {   super.onResume();   if(D) Log.e(TAG, "+ ON RESUME +");   // Performing this check in onResume() covers the case in which BT was   // not enabled during onStart(), so we were paused to enable it...   // onResume() will be called when ACTION_REQUEST_ENABLE activity returns.   if (mService != null) {    // Only if the state is STATE_NONE, do we know that we haven't started already    if (mService.getState() == BluetoothService.STATE_NONE) {      // Start the Bluetooth chat services      mService.start();    }   }  }  private void setupService() {   Log.d(TAG, "setupService()");   // Initialize the BluetoothChatService to perform bluetooth connections   mService = new BluetoothService(this, mHandler);   // Initialize the buffer for outgoing messages   mOutStringBuffer = new StringBuffer("");   //定时任务   mTimer.schedule(new TimerTask() {    @Override    public void run() {     // TODO Auto-generated method stub     if(mService==null || mService.getState()!=BluetoothService.STATE_CONNECTED) return;     MainActivity.this.sendMessage("GetT:");     try{ Thread.sleep(100); }catch(Exception e){}     MainActivity.this.sendMessage("GetS:");     try{ Thread.sleep(100); }catch(Exception e){}     MainActivity.this.sendMessage("GetC:");     try{ Thread.sleep(100); }catch(Exception e){}     MainActivity.this.sendMessage("GetF:");     try{ Thread.sleep(100); }catch(Exception e){}    }   }, 0,1000);  }  @Override  public synchronized void onPause() {   super.onPause();   if(D) Log.e(TAG, "- ON PAUSE -");  }  @Override  public void onStop() {   super.onStop();   if(D) Log.e(TAG, "-- ON STOP --");  }  @Override  public void onDestroy() {   super.onDestroy();   if(mTimer!=null)mTimer.cancel();   // Stop the Bluetooth chat services   if (mService != null) mService.stop();   if(D) Log.e(TAG, "--- ON DESTROY ---");  }  //========End Activity  //========Send Msg  private void sendMessage(String message) {   // Check that we're actually connected before trying anything   if (mService.getState() != BluetoothService.STATE_CONNECTED) {    Toast.makeText(this, "未链接到设备", Toast.LENGTH_SHORT).show();    return;   }   // Check that there's actually something to send   if (message.length() > 0) {    // Get the message bytes and tell the BluetoothChatService to write    byte[] send = message.getBytes();    mService.write(send);    // Reset out string buffer to zero and clear the edit text field    mOutStringBuffer.setLength(0);   }  }  //========End Send Msg  //=======Handle========  // The Handler that gets information back from the BluetoothChatService  private final Handler mHandler = new Handler() {   @Override   public void handleMessage(Message msg) {    switch (msg.what) {    case MESSAGE_STATE_CHANGE:     if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);     switch (msg.arg1) {     case BluetoothService.STATE_CONNECTED:      MainActivity.this.setTitle("链接到设备->" + mConnectedDeviceName);      break;     case BluetoothService.STATE_CONNECTING:      MainActivity.this.setTitle("正在建立链接...");      break;     case BluetoothService.STATE_LISTEN:       MainActivity.this.setTitle("未链接-待命");      break;     case BluetoothService.STATE_NONE:      MainActivity.this.setTitle("未链接-初始");      break;     }     break;    case MESSAGE_WRITE:     byte[] writeBuf = (byte[]) msg.obj;     // construct a string from the buffer     String writeMessage = new String(writeBuf);     break;    case MESSAGE_READ:     //byte[] readBuf = (byte[]) msg.obj;     // construct a string from the valid bytes in the buffer     //String readMessage = new String(readBuf, 0, msg.arg1);     //mConversationArrayAdapter.add(mConnectedDeviceName+":  " + readMessage);     Log.d(TAG, msg.obj.toString());     //Toast.makeText(getApplicationContext(),mConnectedDeviceName+":  " + msg.obj.toString(),Toast.LENGTH_LONG).show();     handleMessageRead(msg.obj.toString());     break;    case MESSAGE_DEVICE_NAME:     // save the connected device's name     mConnectedDeviceName = msg.getData().getString(DEVICE_NAME);     Toast.makeText(getApplicationContext(), "Connected to "           + mConnectedDeviceName, Toast.LENGTH_SHORT).show();     break;    case MESSAGE_SETF_ENABLE:     btnSetF.setEnabled(true);     break;    case MESSAGE_SETT_ENABLE:     btnSyncTime.setEnabled(true);     break;    case MESSAGE_TOAST:     Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST),           Toast.LENGTH_SHORT).show();     break;    }   }  };  private void handleMessageRead(String msg)  {   if(msg!=null && msg.length() >=7){    msg=msg.trim();    boolean isSuccess=false;    if(msg.startsWith("OK-"))isSuccess=true;    msg=msg.substring(3);    if(msg.startsWith("SetT:")){     Toast.makeText(getApplicationContext(), isSuccess ? "时间同步成功" : "时间同步失败",Toast.LENGTH_SHORT).show();    }else if(msg.startsWith("SetF:"))    {     String err=msg.substring(5);     Toast.makeText(getApplicationContext(), isSuccess ? "定时设置成功" : "定时设置失败:" + err,Toast.LENGTH_SHORT).show();     if(isSuccess){      setTips();     }    }else if(msg.startsWith("GetT:")){      txtTime.setText(msg.substring(5));    }else if(msg.startsWith("GetS:")) {     String status=msg.substring(5);     txtStatus.setText(  "1".equals(status) ?"" :"");     }else if(msg.startsWith("GetC:")) {     String c=msg.substring(5);     txtTemperature.setText(c);    }else if (msg.startsWith("GetF:")) {     if(isSuccess && msg.length()>=43){      String bTime=msg.substring(5,24);      String eTime=msg.substring(24,43);      try{       getFBTime=DateUtil.parse(bTime);       getFETime=DateUtil.parse(eTime);      }catch(Exception e){}      if("...".equals(txtBTime.getText().toString())         &&          "...".equals(txtETime.getText().toString())        )      {       txtBTime.setText(bTime);       txtETime.setText(eTime);      }      setTips();     }    }    if(dialog!=null){     dialog.dismiss();     dialog=null;    }   }  }  private void setTips() {   Date now=null;   Date bTime=null;   Date eTime=null;   try{    now=DateUtil.parse(txtTime.getText().toString());    if(getFBTime!=null){     bTime=getFBTime;    }else {     bTime=DateUtil.parse(txtBTime.getText().toString());    }    if(getFETime!=null){     eTime=getFETime;    }else{    eTime=DateUtil.parse(txtETime.getText().toString());    }   }catch(Exception e){    Toast.makeText(this, "时间字符解析错误,请重新设置开始结束时间", Toast.LENGTH_LONG).show();    return;   }   if(eTime.compareTo(now)<0){    txtTips.setText("定时设置:执行时段已过");    txtTips.setTextColor(Color.rgb(0xaa, 0xaa, 0xaa));   }else if(bTime.compareTo(now)>0) {    //还未开始    long duration= DateUtil.getSeconds(now, bTime);    int bHour=(int)( duration / (60 * 60));    int bMinutes=(int)( (duration - (bHour * 3600)) / 60);    duration= DateUtil.getSeconds(bTime, eTime);    int eHour=(int)( duration / (60 * 60));    int eMinutes=(int)( (duration - (eHour * 3600)) / 60);    String msg="定时设置:"+ bHour+"小时"+bMinutes+"分钟后开始,持续"+eHour+"小时"+eMinutes+"分钟";    txtTips.setText(msg);    txtTips.setTextColor(Color.rgb(0x00, 0x00, 0xee));   }else {    //已经开始    long duration= DateUtil.getSeconds(now, eTime);    int hour=(int)( duration / (60 * 60));    int minutes=(int)( (duration - (hour * 3600)) / 60);    txtTips.setText("定时设置:已经开始,"+hour+"小时"+minutes+"分钟后结束");    txtTips.setTextColor(Color.rgb(0x00, 0xee, 0x00));   }  }  private void ensureDiscoverable() {   if(D) Log.d(TAG, "ensure discoverable");   if (mBluetoothAdapter.getScanMode() !=    BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);    discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);    startActivity(discoverableIntent);   }  }  private void connectDevice(Intent data, boolean secure) {   // Get the device MAC address   String address = data.getExtras()    .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);   // Get the BLuetoothDevice object   BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);   // Attempt to connect to the device   mService.connect(device, secure);  }  //=======End handle  //=========onActivityResult  public void onActivityResult(int requestCode, int resultCode, Intent data) {   if(D) Log.d(TAG, "onActivityResult " + resultCode);   switch (requestCode) {   case REQUEST_CONNECT_DEVICE_SECURE:    // When DeviceListActivity returns with a device to connect    if (resultCode == Activity.RESULT_OK) {     connectDevice(data, true);    }    break;   case REQUEST_CONNECT_DEVICE_INSECURE:    // When DeviceListActivity returns with a device to connect    if (resultCode == Activity.RESULT_OK) {     connectDevice(data, false);    }    break;   case REQUEST_ENABLE_BT:    // When the request to enable Bluetooth returns    if (resultCode == Activity.RESULT_OK) {     // Bluetooth is now enabled, so set up a chat session     setupService();    } else {     // User did not enable Bluetooth or an error occured     Log.d(TAG, "BT not enabled");     Toast.makeText(this, "蓝牙不可用", Toast.LENGTH_SHORT).show();     finish();    }   }  }  //=========EndonActivityResult==  //=========DateTime pick call back  @Override  public void callback(int callbackType, Object... params) {   //活动时间   if( params != null && params.length == 1){    if (params[0] instanceof Date) {     Date setTime = (Date) params[0];     long currentTime = System.currentTimeMillis() ;     if(callbackType==CALLBACK_SETBTIME){      txtBTime.setText(DateUtil.formatLong(setTime));     } else if(callbackType==CALLBACK_SETETIME) {      txtETime.setText(DateUtil.formatLong(setTime));     }else {      Toast.makeText(this, "异常", Toast.LENGTH_LONG).show();     }    }   }  }  //=========End DateTime pick call back  @Override  public boolean onCreateOptionsMenu(Menu menu) {   // Inflate the menu; this adds items to the action bar if it is present.   getMenuInflater().inflate(R.menu.main, menu);   return true;  }  @Override  public boolean onOptionsItemSelected(MenuItem item) {   Intent serverIntent = null;   switch (item.getItemId()) {   case R.id.secure_connect_scan:    // Launch the DeviceListActivity to see devices and do scan    serverIntent = new Intent(this, DeviceListActivity.class);    startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_SECURE);    return true;   case R.id.insecure_connect_scan:    // Launch the DeviceListActivity to see devices and do scan    serverIntent = new Intent(this, DeviceListActivity.class);    startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_INSECURE);    return true;   case R.id.discoverable:    // Ensure this device is discoverable by others    ensureDiscoverable();    return true;   case R.id.exit:    finish();    return true;   }   return false;  } } 
View Code

最后上图:

1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版

1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版

1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版

1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版

------------------------------------------------------------------------------------------------------------

最后谁将本文从首页移除死全家(诅咒有效期2天)

最后的最后,如有人按上面设计做出的插板或者在制作过程中,发生一切事故或意外本人一概不负责。。。

正文到此结束
Loading...