2019年6月27日 星期四

CC41-a不能連結Android8.0以後的版本

三年多前,淘了好幾片藍芽模組之後一直沒用,最近要安裝Otto就拿出來使用,結果發現不能連線,用模組名稱狗了一下找到底下一位法國人的文章才發現,有問題啊!

https://forum.arduino.cc/index.php?topic=393655.msg2709528




CC41-a是HM10的複製簡化版,使用的是TI的CC2541晶片,跟Android8.0之後的版本會有衝突,如果想知道HM10的資料,可以到底下的公司網站。

http://www.jnhuamao.cn/download_rom_en.asp?id=66#


雖然最上面的連結已經有教怎麼刷韌體,但是,我還是有點不太懂,在不斷搜索之下,終於發現底下的影片,也發現自己焊接技術太爛,根本是pin腳沒焊好。

https://www.youtube.com/watch?v=ez3491-v8Og

所以就去淘了底座,整個給焊上去就不怕了吧。



雖然刷好韌體了,藍牙模組的名稱也從CC41-a改成HMsoft,但是手機搜尋到之後,輸入0000也是不能連啊,查到底下網站有HM10的規格,原來PIN要輸入000000才可以。

http://www.martyncurrey.com/hm-10-bluetooth-4ble-modules/

想說用arduino連進去試試看,輸入AT是會回應OK啦,但是其他指令卻沒有任何反應。

最後,才發現HM10的指令不一樣,懶惰的我不想再去研究了,就直接使用底下路徑的方法,
http://www.martyncurrey.com/hm-10-bluetooth-4ble-modules/#HM-10%20-%20AT%20commands

終於將CC41-a給刷成HMsoft,也可以設定名稱跟密碼連線了。

2019年6月25日 星期二

紅外線

我買的接收器是VS1838B

https://github.com/z3t0/Arduino-IRremote

想要做到把接收到的遙控器編碼顯示在LCD上,並且可以控制繼電器

依照底下程式碼把線接好,使用的是內建的library

#include <LiquidCrystal.h>
#include <IRremote.h>
#include <IRremoteInt.h>

LiquidCrystal lcd(11,12,6,5,4,3);              //設定LCD需要的腳位
  int irReceiverPin = 2;                             //設定紅外線的接收腳位
   int power=7;
  IRrecv irrecv(irReceiverPin);                // 宣告一個變數儲存接收紅外線訊號
  decode_results results;                          // 宣告一個變數儲存儲存訊號解譯的結果

void setup() {
  // put your setup code here, to run once:
lcd.begin(16,2);
lcd.print("hello,world!");
Serial.begin(9600);
  irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
  irrecv.enableIRIn(); // 啟動接收
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.backlight();
  pinMode(7,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
lcd.setCursor(0,1);
  if (irrecv.decode(&results)) {                  // 假如有收到紅外線訊號
    lcd.clear();
    Serial.print("results value is ");             // 輸出解碼後的資料
    Serial.println(results.value, HEX);
    lcd.print(results.value, HEX);

      switch (results.value) {
            case ;
                 //digitalWrite(7,HIGHT);
                  break;

            case ;
                   //digitalWrite(7,LOW);
                     break;   
           }
    delay(1000);
    irrecv.resume();                                     // 準備接收下一個訊號
}



但是,用上面的libraries卻一直無法正確編譯,應該是說對於同一個紅外線按鈕解譯後的數值不固定,所以去找了一本"Arduino實作入門與應用",用作者所提供的libraies,才成功抓到固定的數值,這樣,我就可以把腳位13連到繼電器,用紅外線做了一個遙控開關,


#include <LiquidCrystal.h>
#include<rc95a.h>

int cir=7;                         //紅外線腳位
int led=13;                       //led腳位
LiquidCrystal lcd(11,12,6,5,4,3);              //LCD需要的腳位
int c,i,code;

void setup() {
lcd.begin(16,2);
lcd.print("hello,world!");
pinMode(cir,INPUT);
Serial.begin(9600);
}


void loop() {
    while(1)
      {
        lcd.setCursor(0,1);
     
        Serial.println("ir code is : ");
         loop:
          no_ir=1; ir_ins(cir); if(no_ir==1) goto loop;
         rev();
          for(i=0; i<4; i++)
           {c=(int)com[i]; Serial.print(c);lcd.print(c);}

           code=(int)com[3];
           switch (code)
           {
             case 243:
                digitalWrite(led, HIGH);
                break;
             case 233:
                digitalWrite(led, LOW);
                break;
           }
            delay(30);
       }

}

2019年6月24日 星期一

想要arduino跟手機連線,監測太陽能發電

因為在南投竹山老家安裝了兩片50W的太陽能板,就一直對發電狀況很有興趣
   
   
   
但是, 當初買的控制器沒有任何查詢功能,
不過手邊有一堆淘來的arduino,所以就想說來試試看
目的很簡單,就是想看看幾點開始發電,電壓多少,
電壓很快,只要加個偵測模組就好,
幾點發電就比較麻煩,因為arduino先天記憶體的限制,
好像幾天之後就必須reset,不然就會有記憶體溢位的問題,
所以就變成反推的方式,從太陽能可以發電就開始計時,
看時間就可以反推幾點開始發電,大概知道就好,
雖然想說底下就是完成品了,





























但是,從太陽能可以發電就開始計時的話,arduino的電力就必須由太陽能供電,
所以就再找了降壓模組接到arduino,下圖就是完成品了,
其實,手癢接了個藍芽模組,就是標題說的手機連線,
結果,當我把電壓、溫度、濕度傳回手機的時候,
三個數值會在不同的欄位跳來跳去,電壓顯示在溫度,溫度顯示在溼度,
可是我明明是寫成一次傳回一個數值塞進一個欄位,再進行下一個傳送,
一直想不到問題原因,也不抓畫面了。




























另外,接太陽能的蓄電池,除了汽車用的電池之後,我又用三顆18650當成一組,
做成三組接上去充電,已經一個月是沒有問題,再觀察看看。







2019年6月17日 星期一

HC-SR04超音波測距模組


利用超音波的發射、反射、接收所需的時間來計算距離,
所使用的原理跟公式網路上的說明非常多,但是對物理系的我來說公式都看得懂,
兜到程式上就是連結不起來,只好一步一步來了。

















先講公式的原理,擷取自   https://atceiling.blogspot.com/2017/03/arduino_28.html

在攝氏零度之海平面音速約為331.5公尺/秒,每升高1攝氏度,音速就增加0.607公尺/秒,可以列出一個公式:

•  音速 c = 331.5 + 0.607 * t  (其中 t 為攝氏溫度)。

    例: 攝氏20度時的音速約為: 331.5 + 0.607*20 = 343.64 公尺/秒

因為我們是要把時間轉換成距離,所以知道速度之後,再把

•  音速公尺/秒 換算成 公分/微秒:343.64 * 100 / 1000000 = 0.034364 公分/微秒,亦即

    音速每公分需要29.1 微秒:  1 / 0.034364 = 29.1 微秒/公分

不過,最前面有說過,這個模組的作用是發射、反射、接收所需的時間,因此實際上時間是兩倍,所以還要先把時間除以二。
  duration = pulseIn(echoPin, HIGH);   // 收到高電位時的時間
 
  cm = (duration/2) / 29.1;         // 將時間換算成距離 cm   

那,這個模組是怎麼計算出這個時間呢,擷取自
 http://ming-shian.blogspot.com/2013/09/arduino-hc-sr04.html

還是脫離不了最前面所說的發射、反射、接收,重點就是發射超音波,接收反射的超音波,
Trig就是驅動發射超音波,Echo就是送出接收反射的超音波
依據下圖的規格,第一步就是送出10us的TTL pulse給Trig (TTL pulse是什麼),
模組就會送出8個超音波,
最後再去接收時間,(要用pulseIn這個函數,讀取收到反射超音波的時間,所以要寫HIGH)
















  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);     // 給 Trig 高電位,持續 10微秒
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);             // 讀取 echo 的電位
  duration = pulseIn(echoPin, HIGH);   // 收到高電位時的時間


配合Otto的腳位,trig是8, echo是9,完整的測試碼如下所示

int trigPin = 8;                  //Trig Pin
int echoPin = 9;                  //Echo Pin
long duration, cm, inches;

void setup() {
  Serial.begin (9600);             // Serial Port begin
  pinMode(trigPin, OUTPUT);        //Define inputs and outputs
  pinMode(echoPin, INPUT);
}

void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);     // 給 Trig 高電位,持續 10微秒
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);             // 讀取 echo 的電位
  duration = pulseIn(echoPin, HIGH);   // 收到高電位時的時間

  cm = (duration/2) / 29.1;         // 將時間換算成距離 cm 或 inch 
  inches = (duration/2) / 74;

  Serial.print("Distance : "); 
  Serial.print(inches);
  Serial.print("in,   ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
 
  delay(250);
}