Arduino 项目笔记|萌宠情绪监控狗窝

1、PS UI设计:

功能描述: 狗窝内设有语音翻译器,能够将狗狗的需求翻译传达出来,使主人能够及时对狗狗进行喂食,送水等,狗窝内还床和猫沙区,且狗窝内还有监视器和用于显示主人和狗狗互动的屏幕,监视器能够记录狗狗的生活情况,及时发现狗狗的身体状况。
在这里插入图片描述

2、Vlcd HMI 组态屏幕 UI设计:

在这里插入图片描述

3、Arduino单片机I2C通信LCD屏

在这里插入图片描述

代码如下(示例):

        sensorValue = analogRead(analogInPin); //
        int outputValue = map(sensorValue, 0, 1023, 0, 255);  //
                
        Serial.print("sensor = ");//
        Serial.print(sensorValue);//
        Serial.print("outputValue = ");//
        Serial.print(outputValue);//

  if(analogRead(analogInPin)>= 700)
  {

        TFTlcd.SetPage(3);//sad page id is 3主页
        delay(1000);
    
    }
    else
    {   
        TFTlcd.SetPage(2);//sad page id is 3主页
        delay(random(5000,10000));
      }
        TFTlcd.SetPage(1);//main page id is 1主页
        delay(1000);
        TFTlcd.SetPage(2);//happy page id is 2主页
        delay(1000);
        TFTlcd.SetPage(3);//sad page id is 3主页
        delay(1000);



#include <LiquidCrystalDisplay.h>

const int analogInPin = A0;  // 
//const int analogOutPin = 9; //

int sensorValue = 0;        // 

const uint8_t String01[]="Password ok!";
const uint8_t String02[]="Password error!";
const uint8_t String03[]="Error";

const uint8_t String04[]="Input number ok!";
const uint8_t String05[]="Input number error!";

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;
uint8_t   page_Id_bk = 0;
uint8_t   page_Id = 0;
uint8_t   targe_Id = 0;

LiquidCrystal TFTlcd(13);//RST pin13

void setup()
{
   update_en =0;
   data_size =0;
   TFTlcd.queue_reset();
   
   Serial.begin(9600);
   Serial.println(F("Paint!"));
   TFTlcd.begin();

   attachInterrupt(0,LcdIICInterrupt,FALLING);//Interrupt 0 is D2 PIN
   TFTlcd.SetPage(4);//main page id is 4
}

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);
     //Serial.println(identifier, HEX);
    }
    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);
       //Serial.println(identifier, HEX);
      }
    }
}

void loop()
{

//
//        sensorValue = analogRead(analogInPin); //
//        int outputValue = map(sensorValue, 0, 1023, 0, 255);  //
//                
//        Serial.print("sensor = ");//
//        Serial.print(sensorValue);//
//        Serial.print("outputValue = ");//
//        Serial.print(outputValue);//
//
//  if(analogRead(analogInPin)>= 700)
//  {
//
//        TFTlcd.SetPage(3);//sad page id is 3主页
//        delay(1000);
//    
//    }
//    else
//    {   
//        TFTlcd.SetPage(2);//sad page id is 3主页
//        delay(random(5000,10000));
//      }
        TFTlcd.SetPage(1);//main page id is 1主页
        delay(1000);
        TFTlcd.SetPage(2);//happy page id is 2主页
        delay(1000);
        TFTlcd.SetPage(3);//sad page id is 3主页
        delay(1000);
  
//	data_size = TFTlcd.queue_find_cmd(cmd_buffer,CMD_MAX_SIZE);
//  if(data_size>0)//receive command
//  {
//    //Serial.println(data_size, HEX);
//    Serial.println(F("ProcessMessage"));
//    ProcessMessage((PCTRL_MSG)cmd_buffer, data_size);//command process
//  } 
//
//  if(update_en)
//  {
//    Serial.println(F("UpdateUI"));
//    update_en = 0;
//    delay(100);
//    UpdateUI();
//  }
}

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;
    switch(cmd_type)
    {
    case NOTIFY_TOUCH_BUTTON:
      NotifyTouchButton(page_id,control_id,_status,key_type,key_value);
      break;
  
    case NOTIFY_TOUCH_CHECKBOX:
      NotifyTouchCheckbox(page_id,control_id,_status,key_type,key_value);
      break;
  
    case NOTIFY_TOUCH_SLIDER:
      NotifyTouchSlider(page_id,control_id,_status,key_type,key_value);
      break;

    case NOTIFY_TOUCH_EDIT:
    NotifyTouchEdit(page_id,control_id,_status,key_type,key_value);
    break;
    
    case NOTIFY_GET_EDIT:
     NotifyGetEdit((PEDIT_MSG)cmd_buffer);
      break;

    case NOTIFY_GET_TOUCH_EDIT:
    NotifyGetTouchEdit((PEDIT_MSG)cmd_buffer);
    break;
  
    case NOTIFY_GET_PAGE:
      NotifyGetPage(page_id,_status);
      break;
  
    case NOTIFY_GET_CHECKBOX:
      NotifyGetCheckbox(page_id,control_id,_status,key_type,key_value);
      break;
  
    case NOTIFY_GET_SLIDER:
      NotifyGetSlider(page_id,control_id,_status,key_type,key_value);
      break;
      
    default:
      break;
  }
}

void UpdateUI()
{
    int i;
    int value;
    if(page_Id == Text_PAGE)
    {
      TFTlcd.SetNumberValue(page_Id,19,20);
      TFTlcd.SetNumberValue(page_Id,20,21);
      TFTlcd.SetNumberValue(page_Id,21,28);
      TFTlcd.SetNumberValue(page_Id,22,35);
      TFTlcd.SetNumberValue(page_Id,23,46);
      TFTlcd.SetNumberValue(page_Id,24,58);
      TFTlcd.SetLableValue(page_Id,16,(unsigned char *)String03);
      TFTlcd.SetLableValue(page_Id,17,(unsigned char *)String03);
      TFTlcd.SetLableValue(page_Id,18,(unsigned char *)String03);
    }
    else if(page_Id == Waveform_PAGE)
    {
       Serial.println(F("Waveform_PAGE"));
      for(i=-125;i<125;i+=1)
      {
        value = 20*sin(PI/50*i);
        TFTlcd.SetWaveformValue(page_Id,9,2,value+119);
        TFTlcd.SetWaveformValue(page_Id,9,1,value+59);
        delay(10);
      }
    }
    else if(page_Id == Temperture_PAGE)
    {
      value =20;
      for(i=0;i<=10;i+=1)
      {
        TFTlcd.SetThermometerValue(page_Id,9,value);
        TFTlcd.SetNumberValue(page_Id,11,value-20);
        value +=10;
        delay(200);
      }
  
      value =120;
      for(i=0;i<=10;i+=1)
      {
        TFTlcd.SetThermometerValue(page_Id,9,value);
        TFTlcd.SetNumberValue(page_Id,11,value-20);
        value -=10;
        delay(200);
      }
    }
    else if(page_Id == Slider_PAGE)
  {
    value =0;
    for(i=0;i<10;i+=1)
    {
      TFTlcd.SetProgressbarValue(page_Id,18,value);
      TFTlcd.SetProgressbarValue(page_Id,20,value);
      value +=10;
      delay(200);
    }
  }
  else if(page_Id == CircleGauge_PAGE)
  {
    value =0;
    for(i=0;i<=10;i+=1)
    {
      TFTlcd.SetCircleGaugeValue(page_Id,37,value);
      TFTlcd.SetBarGaugeValue(page_Id,40,value);
      
      value +=10;
      delay(200);
    }

    value =100;
    for(i=0;i<=10;i+=1)
    {
      TFTlcd.SetCircleGaugeValue(page_Id,37,value);
      TFTlcd.SetBarGaugeValue(page_Id,40,value);
      
      value -=10;
      delay(200);
    }
  }
  else if(page_Id == BarGauge_PAGE)
  {
    value =0;
    for(i=0;i<=10;i+=1)
    {
      TFTlcd.SetBatteryValue(page_Id,44,value);
      TFTlcd.SetWaterGaugeValue(page_Id,42,value);
      value +=10;
      delay(100);
    }

    value =100;
    for(i=0;i<=10;i+=1)
    {
      TFTlcd.SetBatteryValue(page_Id,44,value);
      TFTlcd.SetWaterGaugeValue(page_Id,42,value);
      value -=10;
      delay(100);
    }
  }
}

void NotifyTouchButton(uint8_t page_id, uint8_t control_id, uint8_t  state,uint8_t type,uint8_t value)
{
  //TODO:
  if(type == CHANGE_PAGE&& state == KEY_RELEASE)
  {
    page_Id = value;
    update_en = 1;
    //UpdateUI();
  }
  else if(type == ENTER&& state == KEY_RELEASE)
  {
    targe_Id = value;//targe Edit Id
     TFTlcd.GetEditValue(page_Id,targe_Id);
  }
  else if(type == CHAR)
  {
  
  }
  else if(type == UPLOAD_CONTROL_ID)
  {
  }
  else if(type == CLEAR)
  {
  }

}

void NotifyTouchCheckbox(uint8_t page_id, uint8_t control_id, uint8_t  state,uint8_t type,uint8_t value)
{
  //TODO:
  if(state == SELECT)
    update_en = 1;
  //UpdateUI();
}

void NotifyTouchSlider(uint8_t page_id, uint8_t control_id, uint8_t  state,uint8_t type,uint8_t value)
{
  //TODO:
  if(update_en != 1)
  TFTlcd.SetNumberValue(page_Id,28,(uint16_t)value);
  //UpdateUI();
}

void NotifyTouchEdit(uint8_t page_id, uint8_t control_id, uint8_t  state,uint8_t type,uint8_t value)
{
  //TODO:
  if(update_en != 1)
    TFTlcd.GetTouchEditValue(page_Id,control_id);
  
}

void NotifyGetEdit(PEDIT_MSG msg)
{
  uint8_t cmd_type    = msg->cmd_type;  //command
  uint8_t control_id  = msg->control_id;//object Id
  uint8_t page_id     = msg->page_id;   //page Id
  uint8_t _status     = msg->status;


  //The test passward number 1 2 3 4,ASCII code is 0x31 0x32 0x33 0x34
  if(msg->param[0] == 0x31 && msg->param[1] == 0x32 && msg->param[2] == 0x33 && msg->param[3] == 0x34)
  {
    TFTlcd.Display_Message(0X18,2,(unsigned char *)String01);  
  }
  else
  {
    TFTlcd.Display_Message(0X18,2,(unsigned char *)String02);  
  }
 
}

void NotifyGetTouchEdit(PEDIT_MSG msg)
{
  uint8_t cmd_type    = msg->cmd_type;  //command
  uint8_t control_id  = msg->control_id;//object Id
  uint8_t page_id     = msg->page_id;   //page Id
  uint8_t _status     = msg->status;


  //The test passward number 1 2 3 4,ASCII code is 0x31 0x32 0x33 0x34
  if(msg->param[0] == 0x31 && msg->param[1] == 0x32 && msg->param[2] == 0x33 && msg->param[3] == 0x34)
  {
    TFTlcd.Display_Message(0X18,2,(unsigned char *)String04);  
  }
  else
  {
    TFTlcd.Display_Message(0X18,2,(unsigned char *)String05);  
  }
 
}

void NotifyGetPage(uint8_t page_id,uint8_t status)
{
  //TODO:
  if(status == SUCCESS)
    page_Id = page_id;
}


void NotifyGetCheckbox(uint8_t page_id, uint8_t control_id, uint8_t  state,uint8_t type,uint8_t value)
{
  //TODO:
  if(state == SELECT)
  {
    update_en = 1;
  }
  //UpdateUI();
}

void NotifyGetSlider(uint8_t page_id, uint8_t control_id, uint8_t  state,uint8_t type,uint8_t value)
{
  //TODO:
  if(state == SUCCESS)
  {
    //success get value
  }
  update_en = 1;
}


成品展示(如图):
在这里插入图片描述
在这里插入图片描述

远程摄像机app下载:http://lookcam.ffvv.xyz:8800/lookcam_download.html
在这里插入图片描述


参考资料

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。其主要功能有1.灵活可扩展性、2.海量消息堆积能力、3.支持顺序消息、4.多种消息过滤方式、5.支持事务消息、6.回溯消费等常用功能。 RocketMQ 核心的四大组件:Name Server、Broker、Producer、Consumer ,每个组件都可以部署成集群进行水平扩展。 2、适应人群 有一定的Java基础,并且有分布式项目开发经验。 3、课程价值 可以让初学者对分布式系统解耦有一定认识,并且能够通过快速使用RocketMQ实现分布式服务的异步通信,同时本课程还会通过项目案例实战让学员对RocketMQ的应用场景有所体会,最后再通过源码角度让学员对RocketMQ的原理有所理解,不仅做到“知其然”,亦“知其所以然”。 4、课程收获 1. 理解消息中间件MQ的优势和应用场景 2. 掌握RocketMQ的核心功能,以及各种消息发送案例 3. 通过电商项目深刻理解RocketMQ在使用项目中的落地应用 4. 通过RocketMQ高级功能和源码学习,对RocketMQ的技术细节和原理有更加透彻的理解 5、课程亮点 l  核心功能 n  MQ介绍 n  环境准备 n  RocketMQ高可用集群搭建 n  各种消息发送样例 l  综合练习 n  项目背景介绍 n  功能分析 n  项目环境搭建 n  下单功能,保证各服务的数据一致性 n  确认订单功能,通过消息进行数据分发 n  整体联调 l  高级功能 n  消息的存储和发送 n  消息存储结构 n  刷盘机制 n  消息的同步复制和异步复制 n  负载均衡 l  源码分析 n  路由中心NameServer n  消息生产者Producer n  消息存储 n  消息消费Consumer 6、主讲内容 章节一:核心功能 1.     快速入门 a)     MQ介绍 b)     作用 c)      注意事项 d)     各MQ产品比较 2.     RocketMQ环境搭建 a)     环境准备 b)     安装RocketMQ c)      启动RocketMQ d)     测试RocketMQ e)     关闭RocketMQ 3.     RocketMQ高可用集群搭建 a)     集群各角色介绍 b)     集群搭建方式 c)      双主双从集群搭建 d)     集群监控平台 4.     各种消息发送样例 a)     同步消息 b)     异步消息 c)      单向消息 d)     顺序消息 e)     批量消息 f)      过滤消息 g)     事务消息 章节二:项目实战 1.    项目背景介绍 (1)    电商高可用MQ实战 2.    功能分析 (1)    下单功能 (2)    支付功能 3.    项目环境搭建 (1)    SpringBoot (2)    Dubbo (3)    Zookeeper (4)    RocketMQ (5)    Mysql 4.下单功能,保证各服务的数据一致性 5.确认订单功能,通过消息进行数据分发 章节三:高级功能 1. 消息的存储和发送 2. 消息存储结构 3. 刷盘机制 (1)    同步刷盘 (2)    异步刷盘 4. 消息的同步复制和异步复制 5. 负载均衡 (1)    Producer负载均衡 (2)    Consumer负载均衡 章节四:源码分析 1.     路由中心NameServer a)     NameServer架构设计 b)     NameServer启动流程 c)      NameServer路由注册和故障剔除 2.     消息生产者Producer a)     生产者启动流程 b)     生产者发送消息流程 c)      批量发送 3.     消息存储 a)     消息存储流程 b)     存储文件与内存映射 c)      存储文件 d)     实时更新消息消费队列和存储文件 e)     消息队列与索引文件恢复 f)      刷盘机制 4.     过期文件删除机制 a)     消息消费Consumer b)     消费者启动流程 c)      消息拉取 d)     消息队列负载均衡和重新分布机制 e)     消息消费过程 f)      定时消息机制 g)     顺序消息
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页