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
在这里插入图片描述


参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naiva

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值