触摸屏控制智能家居开关灯

该博客介绍了使用Arduino Uno和 Mega2560开发板,配合Zigbee模块实现的智能家居灯光控制系统。通过SPI触摸屏进行交互,用户可以点击屏幕上的按钮控制两个灯光的开关。系统包括Zigbee的组网设置,SPI触摸屏的显示与事件处理,以及 Arduino 代码实现的灯控逻辑。此外,还提供了Uno终端的代码,用于接收Zigbee消息并控制RGB灯的亮度和颜色。
摘要由CSDN通过智能技术生成

这里我用到的是三个zigbee模块、两个uno、一个mega2560开发板。

 

思路如图:由于 目前只有三个zigbee,所以暂时就控制两个灯吧。逻辑图如下:

涉及到的知识:zigbee组网、spi触摸屏如何设计屏幕以及获取触摸点击事件。

一、zigbee组网设置

我买的zigbee模块是zigbee CC2530 UART串口透传模块,比较适合二次开发 。组网设置简单,设置一个协调器,其他两个设置成终端,通过串口发送给协调器消息,协调器在发消息给终端。

其中,设置协调器、终端的方是用的是商家提供的软件,设置比较简单,注意记录下波特率,我们写程序的时候最好用和zigbee一样的波特率。

二、mega2560 触摸屏

使用的是spi通信的4.0寸屏幕ST7796

1、中文字体屏幕显示一般都是取字模,如图:

将字模放入代码里,屏幕的坐标轴,x轴图中已经标出,竖着的是y轴。

 代码:压缩包在审核,之后上传。如果需要会员才能下载,评论我发你,刚写博客,不太会弄这个。。。

arduinomega2560触摸屏中英文显示-嵌入式文档类资源-CSDN文库

部分代码如下:

  my_lcd.Init_LCD();//屏幕初始化
  my_lcd.Fill_Screen(BLACK);//屏幕背景色
  show_chinese(50, 100, BLUE, WHITE, "下午好哈!", 32, 1);//括号里依次是:x\y轴,文字色、文字背景色,文字,“1”表示不需要文字背景色,“0”是需要文字背景色
  show_chinese(50, 150, BLUE, WHITE, "朋友们!", 32, 1);
  my_lcd.Set_Text_Back_colour(BLACK);//背景色
  my_lcd.Set_Text_colour(BLUE);
  my_lcd.Set_Text_Size(3);
  my_lcd.Print_String("Hello World!", 30, 200);//括号里依次是:文字,x\y轴

2、触摸事件,打印坐标,设置范围

这两句代码点击屏幕,会显示坐标,这里可以加一个300毫秒。

3、触摸屏智能家居灯代码

代码压缩包:

 触摸屏智能家居灯触摸屏代码-智能家居文档类资源-CSDN文库

#include "LCDWIKI_GUI.h"//Core graphics library
#include "LCDWIKI_SPI.h"//Hardware-specific library
#include "LCDWIKI_TOUCH.h" //touch screen library

#define MODEL ST7796S
#define CS   A5
#define CD   A3
#define RST  A4
#define LED  A0
#define TCS   45
#define TCLK  46
#define TDOUT 47
#define TDIN  48
#define TIRQ  49
LCDWIKI_SPI my_lcd(MODEL, CS, CD, RST, LED);
LCDWIKI_TOUCH my_touch(TCS, TCLK, TDOUT, TDIN, TIRQ);
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
uint16_t color_mask[] = {0xF800, 0xFFE0, 0x07E0, 0x07FF, 0x001F, 0xF81F}; //color select
#define COLORBOXSIZE my_lcd.Get_Display_Width()/6
#define PENBOXSIZE my_lcd.Get_Display_Width()/4

int16_t old_color, current_color, flag_colour;
int16_t old_pen, current_pen, flag_pen;
boolean show_flag = true;

void show_string(uint8_t *str, int16_t x, int16_t y, uint8_t csize, uint16_t fc, uint16_t bc, boolean mode)
{

  my_lcd.Set_Text_Mode(mode);
  my_lcd.Set_Text_Size(csize);
  my_lcd.Set_Text_colour(fc);
  my_lcd.Set_Text_Back_colour(bc);
  my_lcd.Print_String(str, x, y);
}
int x=100;
void button1(void)//对button两个按钮定义,同一横排y轴相同,x不同
{
  my_lcd.Set_Draw_color(GREEN);//底色
  my_lcd.Fill_Round_Rectangle(100, 150, 150, 200, 20); //距左  上   横向   纵向  四周边角设计
  my_lcd.Fill_Round_Rectangle(200, 150, 250 , 200, 20); //距左  上   横向   纵向  四周边角设计
  show_string("LED1", 100, x, 2, BLUE, BLACK, 1); //文字
  show_string("LED2", 200, 165, 2, RED, BLACK, 1);
}

void button2(void)
{
  my_lcd.Set_Draw_color(RED);
  my_lcd.Fill_Round_Rectangle(100, 80, 150, 130, 20);
  my_lcd.Fill_Round_Rectangle(200, 80, 250 , 130, 20);
  show_string("LED1", 100, 100, 2, BLUE, BLACK, 1);
  show_string("LED2", 200, 100, 2, YELLOW, BLACK, 1);

}
void button3(void)
{
  my_lcd.Set_Draw_color(BLUE);
  my_lcd.Fill_Round_Rectangle(100, 220, 150, 270, 20);
  my_lcd.Fill_Round_Rectangle(200, 220, 250 , 270, 20);
  show_string("LED1", 100, 240, 2, RED, BLACK, 1);
  show_string("LED2", 200, 240, 2, YELLOW, BLACK, 1);

}
void button4(void)
{
  my_lcd.Set_Draw_color(YELLOW);
  my_lcd.Fill_Round_Rectangle(100, 290, 150, 340, 20);
  my_lcd.Fill_Round_Rectangle(200, 290, 250 , 340, 20);
  show_string("LED1", 100, 305, 2, BLUE, WHITE, 1);
  show_string("LED2", 200, 305, 2, BLUE, WHITE, 1);
  show_string("CLOSE", 100, 345, 2, RED, WHITE, 1);
  show_string("CLOSE", 200, 345, 2, RED, WHITE, 1);
  show_string("Please control the light switch", 20, 400, 2, WHITE, WHITE, 1);
}

void setup(void)
{

  my_lcd.Init_LCD();
  my_lcd.Set_Rotation(0);
  my_touch.TP_Set_Rotation(3);
  my_touch.TP_Init(my_lcd.Get_Rotation(), my_lcd.Get_Display_Width(), my_lcd.Get_Display_Height());
  my_lcd.Fill_Screen(BLACK);
  button1();
  button2();
  button3();
  button4();
  current_color = RED;
  current_pen = 0;
  Serial.begin(38400);
}

void loop()
{
comme:
  my_touch.TP_Scan(0);
  if (my_touch.TP_Get_State()&TP_PRES_DOWN)//如果有触摸
  {
    Serial.println(my_touch.y);//打印坐标
    Serial.println(my_touch.x);
    //对button1区域两个按钮触发点击范围判断
    if ((my_touch.y > 150) && (my_touch.y < 200))
    {
      if (((my_touch.x > 100) && (my_touch.x < 150)) && !flag_pen)
      {
        Serial.println("1");//传给zigbee,串口透传,zigbee终端收到消息发给uno,uno控制灯
        delay(300);
      }
      if (((my_touch.x > 200) && (my_touch.x < 250)) && !flag_pen)
      {

        Serial.println("2");
        delay(300);

      }
    }

    //对button2区域两个按钮触发点击范围判断
    if ((my_touch.y > 80) && (my_touch.y < 110))
    {
      if (((my_touch.x > 100) && (my_touch.x < 130)) && !flag_pen)
      {

        Serial.println("3");
        delay(300);

      }
      if (((my_touch.x > 200) && (my_touch.x < 250)) && !flag_pen)
      {

        Serial.println("4");
        delay(300);
      }
    }
    //对button3区域两个按钮触发点击范围判断
    if ((my_touch.y > 220) && (my_touch.y < 260))
    {
      if (((my_touch.x > 80) && (my_touch.x < 130)) && !flag_pen)
      {

        Serial.println("5");
        delay(300);

      }
      if (((my_touch.x > 200) && (my_touch.x < 250)) && !flag_pen)
      {

        Serial.println("6");
        delay(300);
      }
    }
    //对button4区域两个按钮触发点击范围判断
    if ((my_touch.y > 300) && (my_touch.y < 340))
    {
      if (((my_touch.x > 80) && (my_touch.x < 130)) && !flag_pen)
      {

        Serial.println("7");
        delay(300);

      }
      if (((my_touch.x > 200) && (my_touch.x < 250)) && !flag_pen)
      {
 
        Serial.println("8");
        delay(300);
      }
    }
  }
}

 其中,我把需要的库文件都放在arduino文件中,大家没有库也不会报错

 伙伴们也可以github下载,搜这些库,复制上面代码,把" "改成< >这种就可以了

uno端代码,两个uno终端,uno连接zigbee

zigbee的vcc一定要连3.3v,RX连接uno的10引脚,TX连接11引脚

#include <SoftwareSerial.h>
//uno部分,两个终端代码
const int led=7;
int ledstate =HIGH;
SoftwareSerial arduinoSerial = SoftwareSerial(10,11);
String  clientRequest ="";
void setup() {
  // put your setup code here, to run once:
   Serial.begin(38400);
   arduinoSerial.begin(38400);
   arduinoSerial.flush();
    pinMode(4,OUTPUT);
   digitalWrite(4,HIGH);
   pinMode(5,OUTPUT);
   digitalWrite(5,HIGH);
   pinMode(6,OUTPUT);
   digitalWrite(6,HIGH);
   pinMode(7,OUTPUT);
   digitalWrite(7,HIGH);
}

void loop()
 {
    if (arduinoSerial.available() > 0){
       clientRequest =clientRequest + char(arduinoSerial.read());
       Serial.println(clientRequest);
//     if (clientRequest=="3"){//RED     //上传一次代码后,第二个uno换成注释的这几段
//    digitalWrite(5,LOW);
//     digitalWrite(6,HIGH);
//      digitalWrite(7,HIGH);
//      delay(300);
//     }
//
//    if (clientRequest=="1"){//GREEN
//    digitalWrite(5,HIGH);
//     digitalWrite(6,LOW);
//      digitalWrite(7,HIGH);
//      delay(300);
//     }
//      if (clientRequest=="5"){//BLUE
//    digitalWrite(5,HIGH);
//     digitalWrite(6,HIGH);
//      digitalWrite(7,LOW);
//      delay(300);
//     }
//      if (clientRequest=="7"){//CLOSE
//    digitalWrite(5,HIGH);
//     digitalWrite(6,HIGH);
//      digitalWrite(7,HIGH);
//      delay(300);
//     }
     if (clientRequest=="4"){//RED
    digitalWrite(5,LOW);
     digitalWrite(6,HIGH);
      digitalWrite(7,HIGH);
      delay(300);
     }

    if (clientRequest=="2"){//GREEN
    digitalWrite(5,HIGH);
     digitalWrite(6,LOW);
      digitalWrite(7,HIGH);
      delay(300);
     }
      if (clientRequest=="6"){//BLUE
     digitalWrite(5,HIGH);
     digitalWrite(6,HIGH);
      digitalWrite(7,LOW);
      delay(300);
     }
      if (clientRequest=="8"){//CLOSE
    digitalWrite(5,HIGH);
     digitalWrite(6,HIGH);
      digitalWrite(7,HIGH);
      delay(300);
     }
}
    clientRequest="";
 }

看运行结果,我用的rgb共阳级灯,大家可以试试pwm变色灯呢,加个继电器,把uno板换成nano板,家里就可以用了呢。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哆啦哆小魔仙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值