2016年2月24日 星期三

[分享] Switch 共用埠號注意事項























某些SWITCH 上有相同的埠號同時用在RJ45與GBIC,只能同時啟用一種介面。

例如21 PORT 有插了GBIC 卡,就不能再被RJ45使用了。

2016年2月9日 星期二

[分享] 龘 字

今天在FB看到有人說打出這個字" 龘  " ,他要包紅包,便去查了一下這個字。

念法為ㄉㄚˊ ,蒼頡拼法為 YPYBP  (卜心卜月心)。


                     龘


參考資料:

http://zidian.kxue.com/zi/da64_shurufa.html

[EPS8266] EPS8266 購買注意事項

EPS8266 這塊WiFi Module很紅,我也買了一塊來玩,在爬文更新Firmware時,

發現其實它目前有2種版本,一種是舊款的容量為512K,

新版本的容量為512+512 ( 1M),能用的Firmware也不同。


網路上說最簡單的分別方法是看PCB的顏色,藍色為舊本,黑色為新版,

這個目前還不確定,最保險的分法是看IC上面的編號。

25Q80 開頭是 1M 25Q40 是 512K

或是使用AT+RST  這個Command
























參考來源:

http://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=1295&extra=page%3D1

2016年2月8日 星期一

[Android] 自定Disable背景

利用XML來自定元件被Disable時的模樣,省去用程式碼換圖。

以下是一個背景的XML ,重點在android:state_enabled="false" ,

注意只能指定android:drawable ,不能用android:color 會Crash,

但可以自己用一個shap 自己刻一個喜歡的顏色再拿來用


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
    android:state_enabled="false"
        android:drawable="@drawable/btn_red" />
    <item 
        android:state_pressed="true" 
        android:state_enabled="true"
        android:drawable="@drawable/btn_orange" />
    <item 
        android:state_focused="true" 
        android:state_enabled="true"
        android:drawable="@drawable/btn_orange" />
    <item 
        android:state_enabled="true"
        android:drawable="@drawable/btn_black" />
</selector>



 未按下的狀態

 按下時
enable="false" 

























參考來源:

http://stackoverflow.com/questions/11499574/toggle-button-using-two-image-on-different-state


[Android] NameSpace 'app' is not found

在最外層的layout加上

xmlns:app="http://schemas.android.com/apk/res-auto"

2016年2月7日 星期日

[java] 繞著圓心走的同心圓座標

之前有寫一篇,怎樣算出一個繞著一點走的圓,

接下來我用程式來實現,程式在座標的計算上與數學常用的座標不太一樣。



//半徑
int r = 150;
//座標的矩陣
slidepoint = new int[360][2];
//圓心位址
int x0 = 225;
int y0 = 225;
//計算
for (int i = 1; i < 361; i++) {
    int x1 = (int) (x0 + r * Math.cos(Math.toRadians(i)));
    int y1 = (int) (y0 + r * Math.sin(Math.toRadians(i)));

   slidepoint[360 - i][0] = x1;
   slidepoint[360 - i][1] = y1;
  //draw angle string
   if (i % 10 ==0)
 g.drawString(String.valueOf(i), x1, y1);
}


我先用swing做個示範,每隔10度畫出角度在座標上









































你會發現跟我們習慣的角度好像方向不同,我們做個轉換



class DrawPane extends JPanel {
  public void paintComponent(Graphics g) {
                      //畫大圓
   g.drawOval(0, 0, 450, 450);
                       //大圓
   int r = 150;
                        //座標的矩陣
   slidepoint = new int[360][2];
                        //圓心位址
   int x0 = 225;
   int y0 = 225;
                       //計算
   for (int i = 1; i < 361; i++) {
             int x1 = (int) (x0 + r * Math.cos(Math.toRadians(i)));
      int y1 = (int) (y0 + r * Math.sin(Math.toRadians(i)));

    slidepoint[360 - i][0] = x1;
    slidepoint[360 - i][1] = y1;
    
   }
                        //轉換
   for (int i = 0; i < 360; i++) {
    int x1 = slidepoint[i][0];
    int y1 = slidepoint[i][1];
                                //繪圓
    if (i%10==0)
     g.drawString(String.valueOf(i), x1, y1);
   
   }

  }
 }






[Android] ScrollView在CoordinatorLayout 異常

如果你在CoordinatorLayout 中使用ScrollView發生ScrollView只能滑下來一點點,

底下還有一部份Layout沒辦法顯示出來,但捲軸已經到底,請參考下方網址,把

ScrollView替換成android.support.v4.widget.NestedScrollView


參考網址:


http://stackoverflow.com/questions/30574303/when-using-the-coordinatorlayout-my-scrollview-has-an-incorrect-size

[Arduino] Android透過藍芽控制LED

先來看一段效果
                

用文字表示架構


                 BlueTooth

Android -------------->  BlueTooth Module(HC-05)  --->Arduino ---> LED


分2部份:

第一部份是Arduino 的部份,它必須去控制LED與接收藍芽的訊號。

Arduino Code


#include <SoftwareSerial.h>

#include <Wire.h>

 

// the maximum received command length from an Android system (over the bluetooth)

#define MAX_BTCMDLEN 128

 

// 建立一個軟體模擬的序列埠; 不要接反了!

// HC-05    Arduino

// TX       RX/Pin10

// RX       TX/Pin11

SoftwareSerial BTSerial(10,11); // Arduino RX/TX


 

byte cmd[MAX_BTCMDLEN]; // received 128 bytes from an Android system

int len = 0; // received command length

int LED_Red=12; 
int LED_Green=13;

void setup() {

   pinMode(LED_Red, OUTPUT);
   pinMode(LED_Green, OUTPUT); 

   digitalWrite(LED_Red, LOW);
digitalWrite(LED_Green, LOW);

    Serial.begin(9600);   // Arduino起始鮑率:9600

    BTSerial.begin(9600); // HC-05 出廠的鮑率:每個藍牙晶片的鮑率都不太一樣,請務必確認

}

 

void loop() {

    char str[MAX_BTCMDLEN];

    int insize, ii;  

    int tick=0;

    while ( tick<MAX_BTCMDLEN ) { // 因為包率同為9600, Android送過來的字元可能被切成數份

        if ( (insize=(BTSerial.available()))>0 ){ // 讀取藍牙訊息

            for ( ii=0; ii<insize; ii++ ){

                cmd[(len++)%MAX_BTCMDLEN]=char(BTSerial.read());

            }

        } else {

            tick++;

        }

    }

    if ( len ) { // 用串列埠顯示從Android手機傳過來的訊息

        sprintf(str,"%s",cmd);

        Serial.println(str);

        Serial.println(cmd[0] );
        Serial.println(cmd[1]);
        
        if (cmd[1]==49)
        {
           digitalWrite(LED_Red, HIGH);
        }
        else if (cmd[1]==48)
        {
          digitalWrite(LED_Red, LOW);
        }
        
        if (cmd[0]==49)
        {
           digitalWrite(LED_Green, HIGH);
        }
        else if (cmd[0]==48)
        {
          digitalWrite(LED_Green, LOW);
        }

        cmd[0] = '\0';

    }

    len = 0;

}

Arduino 線路圖

Arduino 3.3  -->   HC-05 VCC

Arduino GND --> 麵包板GND

Arduino  pin10  ---> HC-05  TX

Arduino pin 11 ---> HC-05 RX

Arduino pin 12 ----> Red LED 正極

Arduino pin 13 ----> Green LED 正極

LED 負極接在麵包版負極。

HC-05 GND 接麵包板GND

第二個部份是Android透過藍芽傳輸控制訊號。


package com.example.boywhychen.bluetooth;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;

public class MainActivity extends AppCompatActivity {

    BluetoothAdapter mBtAdapter;
    ListView list;
    Set<BluetoothDevice>  deviceSet;
    BluetoothDevice device;
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    String fiilliste[];
    InputStream mmInStream;
    OutputStream mmOutStrem;
    byte[] command=new byte[4];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        list=(ListView)findViewById(R.id.listView);
        command[2]=(byte)0x0D;
        command[3]=(byte)0x0A;
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                for (BluetoothDevice bd : deviceSet) {
                    if (bd.getName().equals(fiilliste[position])) {
                        device = bd;
                    }
                }
                try {

                    BluetoothSocket mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
                    mmSocket.connect();  // blocking call

                    mmInStream = mmSocket.getInputStream();
                    mmOutStrem = mmSocket.getOutputStream();

                } catch (IOException e) {

                }
            }
        });


        android.support.v7.widget.SwitchCompat red=(android.support.v7.widget.SwitchCompat)findViewById(R.id.red);
        red.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked)
                {
                    command[1]=49;
                }
                else
                {
                    command[1]=48;
                }
                if (mmOutStrem!=null)
                {

                    try {
                        mmOutStrem.write(command);
                        mmOutStrem.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        android.support.v7.widget.SwitchCompat green=(android.support.v7.widget.SwitchCompat)findViewById(R.id.green);

        green.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked)
                {
                    command[0]=49;
                }
                else
                {
                    command[0]=48;
                }
                if (mmOutStrem!=null)
                {

                    try {
                        mmOutStrem.write(command);
                        mmOutStrem.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        mBtAdapter = BluetoothAdapter.getDefaultAdapter();
        // 檢查藍牙是否開啟
        if (!mBtAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        }

        mBtAdapter.startDiscovery();
        // 搜尋到藍牙裝置時,呼叫我們的函式
        IntentFilter filter = new IntentFilter( BluetoothDevice.ACTION_FOUND );
        this.registerReceiver( mReceiver, filter );

        // 搜尋的過程結束後,也呼叫我們的函式
        filter = new IntentFilter( BluetoothAdapter.ACTION_DISCOVERY_FINISHED );
        this.registerReceiver(mReceiver, filter);

    }

    private BroadcastReceiver mReceiver=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            ArrayList<String> stringarray=new ArrayList<String>();
            ArrayAdapter<String> adapter;

            if (intent.getAction()== BluetoothDevice.ACTION_FOUND)
            {
                deviceSet= mBtAdapter.getBondedDevices();
                for (BluetoothDevice bd:deviceSet)
                {
                    stringarray.add(bd.getName());
                }
            }
            fiilliste=new String[stringarray.size()];
            stringarray.toArray(fiilliste);

            adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, fiilliste);

            list.setAdapter(adapter);
        }
    };

}

layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.boywhychen.bluetooth.MainActivity"
    tools:showIn="@layout/activity_main">

    <ListView
        android:id="@+id/listView"
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/red"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/listView"
        android:layout_marginTop="10dp"
        android:text="Red LED" />

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/green"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/red"
        android:layout_marginTop="10dp"
        android:text="Green LED" />
</RelativeLayout>