这里我用到的是三个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板,家里就可以用了呢。