自制觸摸屏電話


幾個周末前閑着無聊做了個觸摸屏電話,功能是簡單了點,只能打電話、接電話、掛斷、接聽。而且個子還大了點,但是總歸還算是做出了點東西,就曬曬。噴吧,哈哈。

小觸摸屏是這樣的(按鈕左上角的編號實際顯示時是沒有的,這里是截的設計狀態的圖):

 

主要元件:觸摸屏、arduino mega、sim800c、功放喇叭、電源(至少1A電流)

原理很簡單:

設計觸摸屏UI、按鈕(廠家提供驅動可以通過arduino檢測觸摸的button)

通過arduino去發送指令到sim800C

先介紹下觸摸屏UI的設計,如下圖就是編輯器:

 Object_Id: 81代表對應按鈕的id,這個id是會回傳到arduino中的,需要對應上才行,比如arduino中檢測到objectId=81被觸發了就代表按下了某個按鈕。

右面的mckay_main代表頁面,后面的5是具體arduino中的id,比如初始化的時候arduino會設置page 5 為默認頁面

圖片也是可以自定義的,只是不能拉伸

最上方的就是編譯按鈕了,會輸出一個vImage.bin文件。

接下來就是將這個vImage.bin燒錄到觸摸屏flash中了,如下圖:

記得先打開相應的COM接口,等到狀態變成了 Open后,click  下載bin,然后就會先擦出整個flash存儲,再慢慢寫入了,這步是比較慢的。

taobao鏈接:https://item.taobao.com/item.htm?id=563235539384&_u=iq9aqj84c5

廠家會提供觸摸屏LCD的設計軟件以及接線方式(別忘了同時買USB轉串口設備,有了就忽略,剛入門的話就買這個)

 

接下來介紹下SIM800C 

淘寶鏈接:https://item.taobao.com/item.htm?id=540672563189&_u=iq9aqj76d8 

 

 這個板子大家還是自己陶下,因為原子哥那里賣的貴。。很貴。。自己買個替代品吧,有便宜的。我是后來才發現買貴了。

這個板子,看上去很多東西,但其實控制這個板子只要插好micro sim卡(得自己去辦卡,或者現成的,得匹配好你買入的板上對應的sim卡座大小)、和通過AT指令就搞定了。

部分AT指令如下:

撥號
ATD137xxxxxxxx;

掛斷-主動掛斷
ATH

接電話
ATA  

那么arduino是如何發送這些指令給這個板呢?

#include <SoftwareSerial.h>
SoftwareSerial SIM800C(10, 11);     // Serial RX, TX

是通過10、11數字pin口模擬了1個串口。  

這里剛接觸的話比較繞,arduino的10是RX、11是TX;需要與SIM800C的TX,RX相連,就是:arduino 10(RX)---->sim800c tx口, arduino 11(TX)--->sim800c rx口

sim800c的tx、rx位置:

除此之外,上圖中央有2個黃色的pin口,其中1個標記了GND,這個需要與arduino的GND相連,必須相連,不然沒效果。

下面看看arduino代碼:

#include <LiquidCrystalDisplay.h>             //這個廠家會提供
#include <SoftwareSerial.h>                   //這個是arduino標准庫

uint8_t   identifier,cnt;
uint8_t   cmd_buffer[CMD_MAX_SIZE];
uint8_t   data_size;
uint8_t   update_en;
uint8_t   command_cmd;
uint8_t   command_statu;
uint8_t   command_length;

LiquidCrystal TFTlcd(13);//RST pin13
SoftwareSerial SIM800C(10, 11);     //Serial RX, TX

void setup()                                            //setup是初始化函數,只運行1次
{
   update_en =0;
   data_size =0;
   TFTlcd.queue_reset();
   
   Serial.begin(9600);
   TFTlcd.begin();

   attachInterrupt(0,LcdIICInterrupt,FALLING);           //pin 2口是中斷0,觸摸屏靠這個來發送中斷命令,FALLING代表當高電平轉變為低電平時觸發
   TFTlcd.SetPage(5);                                    //默認頁id

   SIM800C.begin(9600);
}

void LcdIICInterrupt()
{
    command_cmd = TFTlcd.I2C_Read();
    TFTlcd.queue_push(command_cmd);
    for(cnt =0;cnt <2;cnt++)
    {
      identifier = TFTlcd.I2C_Read();
      TFTlcd.queue_push(identifier);
    }
    command_statu = TFTlcd.I2C_Read();
    TFTlcd.queue_push(command_statu);
    identifier = TFTlcd.I2C_Read();
    TFTlcd.queue_push(identifier);
    command_length = TFTlcd.I2C_Read();
    TFTlcd.queue_push(command_length);
    if((command_cmd == GET_EDIT_VALUE && command_statu == 0x6f)||(command_cmd == GET_TOUCH_EDIT_VALUE && command_statu == 0x6f))
    {
      for(cnt =0;cnt <command_length;cnt++)
      {
        identifier = TFTlcd.I2C_Read();
        TFTlcd.queue_push(identifier);
      }
    }
}

void loop()                                               //循環執行的函數
{
  data_size = TFTlcd.queue_find_cmd(cmd_buffer,CMD_MAX_SIZE);
  if(data_size>0)
      ProcessMessage((PCTRL_MSG)cmd_buffer, data_size);
}

void ProcessMessage( PCTRL_MSG msg, uint16_t dataSize )
{
    uint8_t cmd_type    = msg->cmd_type;
    uint8_t control_id  = msg->control_id;
    uint8_t page_id     = msg->page_id;
    uint8_t _status     = msg->status;
    uint8_t key_type    = msg->key_type;
    uint8_t key_value   = msg->key_value;

    if(control_id==81)                                   //不同的id,代表不同的按鈕的被按下
        dial("137xxxxxxxx");
    else if(control_id==82)
        dial("137xxxxxxxx");
    else if(control_id==83)
        dial("137xxxxxxxx");
    else if(control_id==84)
        dial("137xxxxxxxx");
    else if(control_id==89)
        send_cmd_to_sim800c("ATA");
    else if(control_id==86)
        send_cmd_to_sim800c("ATH");  
}

void dial(String mobileNumber)
{
    String dial_cmd="ATD"+mobileNumber+";";
    send_cmd_to_sim800c(dial_cmd);
}
void send_cmd_to_sim800c(String at_cmd)
{
    Serial.println(at_cmd);
    SIM800C.println(at_cmd);
}  

 

主要的器件和程序就是上面這些了,不過離最終的完成還是需要其他組件的,比如:喇叭功放、降壓模塊轉USB、1帶n DC頭、話筒

OK,該繼續學習新東西了,這個就先這樣了。

 

 

#include <SoftwareSerial.h>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM