zoukankan      html  css  js  c++  java
  • 自制触摸屏电话

    几个周末前闲着无聊做了个触摸屏电话,功能是简单了点,只能打电话、接电话、挂断、接听。而且个子还大了点,但是总归还算是做出了点东西,就晒晒。喷吧,哈哈。

    小触摸屏是这样的(按钮左上角的编号实际显示时是没有的,这里是截的设计状态的图):

    主要元件:触摸屏、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>

  • 相关阅读:
    Netty源码剖析-关闭服务
    Netty源码剖析-断开连接
    Netty源码剖析-发送数据
    Netty源码剖析-业务处理
    Netty源码剖析-接受数据
    Netty源码剖析-构建链接
    html中调用silverlight中的方法
    在Silverlight宿主html页面添加按钮无法显示
    win7旗舰版在安装vs2010后向sql2008添加SQL_Server_Management详解
    javascript arguments
  • 原文地址:https://www.cnblogs.com/aarond/p/arduino_phone.html
Copyright © 2011-2022 走看看