|
多功能LED设计,拥有自动和手动两种模式
1)自动模式,可以通过人体红外传感器检测是否有人,采用光敏电阻构成的电路检测环境光的强度,从而自动实现灯的开启和关闭,也可以根据环境亮度调节灯的亮度;
2)手动模式,可以使用WIFI连接手机,通过手机APP手动控制不同灯的开启和关闭,并可控制LED灯的亮度
单片机选用stm32f103c8t6;APP使用Android stutio环境编写;OLED为7脚,SPI
下面OLED显示图片手动模式对应上面手动模式介绍的功能,WIFI模式对应的手动模式介绍的功能
手机APP程序文件较大,压缩后仍大于20M,下面是网盘链接(第一次使用Android stutio写APP,可能还存在问题,欢迎大家指正)
手机APP程序文件在这里
b220909ben
链接:https://pan.baidu.com/s/13V5m-kApC2MuFutD7ixFaA
提取码:kii9
制作出来的实物图如下:
有人靠近
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
多功能LED原理图
stm32控制主要程序
int main(void)
{
u16 adcx;
float temp;
char display[16]="";
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
delay_ms(100);
WIFI_Init();
Adc_Init();
LED_Init();
KEY_Init();
OLED_Init();
OLED_Clear();
TIM2_Int_Init(9,1799);
TIM3_Int_Init(99,7999);
OLED_Interface();
while(1)
{
if(control_flag)
{
control_flag=0;
switch(KEY_Scan(0))
{
case KEY0_PRES:
if(!confirm_flag)
confirm_flag=1;
else
confirm_flag=0;
OLED_Clear();break;
case KEY1_PRES:
if(!confirm_flag)
{
mode=0;
OLED_Clear();
OLED_ShowChar_16X16(5,1,'>');
};break;
case KEY2_PRES:
if(!confirm_flag)
{
mode=1;
OLED_Clear();
OLED_ShowChar_16X16(5,4,'>');
};break;
default:break;
}
if(!confirm_flag)
OLED_ChooseMode();
else
{
if(mode)
{
OLED_ShowChar_16X16(25,0,'W');
OLED_ShowChar_16X16(35,0,'I');
OLED_ShowChar_16X16(45,0,'F');
OLED_ShowChar_16X16(55,0,'I');
OLED_ShowCHinese(65,0,7);
OLED_ShowCHinese(81,0,8);
OLED_ShowCHinese(5,3,16);
OLED_ShowCHinese(21,3,17);
OLED_ShowChar_16X16(37,3,':');
switch(USART_RX_Temp[0])
{
case 'K':
PWM_OUT=30;
WiFi_Flag=1;
OLED_ShowCHinese(47,3,20);
OLED_ShowCHinese(63,3,22);break;
case 'G':
WiFi_Flag=0;
OLED_ShowCHinese(47,3,21);
OLED_ShowCHinese(63,3,22);break;
case 'Z':
if(PWM_OUT<60)
PWM_OUT+=10;
break;
case 'F':
if(PWM_OUT>0)
PWM_OUT-=10;
break;
default:break;
}
USART_RX_Temp[0]='0';
OLED_ShowCHinese(5,5,18);
OLED_ShowCHinese(21,5,19);
OLED_ShowChar_16X16(37,5,':');
OLED_ShowNum(47,5,PWM_OUT,2,16);
}
else
{
adcx=Get_Adc_Average(ADC_Channel_1,10);
temp=(float)adcx*(3.3/4096);
adcx=temp*10;
OLED_ShowCHinese(25,0,5);
OLED_ShowCHinese(41,0,6);
OLED_ShowCHinese(57,0,7);
OLED_ShowCHinese(73,0,8);
sprintf(display,"ADC=%.2f",temp);
OLED_ShowString(5,4,display);
sprintf(display,"PWM=%d",PWM_OUT);
OLED_ShowString(5,6,display);
if(adcx/10 >= 1 && adcx/10 < 2)
{
if(adcx%10 >=0 && adcx%10 <= 6)
PWM_OUT=0;
else if(adcx%10 > 6)
PWM_OUT=15;
}
else if(adcx/10 >= 2 && adcx/10 < 3)
{
if(adcx%10 >=0 && adcx%10 < 5)
PWM_OUT=30;
else if(adcx%10 >=5)
PWM_OUT=45;
}
else if(adcx/10 >=3)
PWM_OUT=60;
OLED_ShowCHinese(5,2,9);
OLED_ShowCHinese(21,2,10);
OLED_ShowChar_16X16(37,2,':');
if(Log_OUT)
{
if(!Log_Flag)
{
count1=0;
Log_Flag=1;
}
OLED_ShowCHinese(47,2,12);
OLED_ShowCHinese(63,2,13);
OLED_ShowCHinese(79,2,14);
OLED_ShowCHinese(95,2,15);
}
else
{
OLED_ShowCHinese(47,2,11);
OLED_ShowCHinese(63,2,13);
OLED_ShowCHinese(79,2,14);
OLED_ShowCHinese(95,2,15);
}
}
}
}
}
}
//WiFi3õê¼»ˉ3ìDò
void WIFI_Init(void)
{
printf("AT+CWMODE=2\r\n"); //
delay_ms(1000);
printf("AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
printf("AT+CIPMUX=1\r\n");
delay_ms(1000);
printf("AT+CIPSERVER=1,8080\r\n");
delay_ms(1000);
}
APP主要程序
public class MainActivity extends AppCompatActivity {
String IpString = ""; //记录IP地址
int portint = 0; //记录端口号
int Pwm = 100; //pwm输出
Socket socket = null; //定义socket
OutputStream outputStream = null; //定义输出流
String str = "";
ConnectSeverThread connectSeverThread;
ServerThreadTCP serverThreadTCP;
Button mBContButton; //连接按钮
Button mBOpenButton; //打开按钮
Button mBCloseButton;
Button mBPwmZButton;
Button mBPwmFButton;
EditText mBIPEditText;
EditText mBPortEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBContButton = (Button) findViewById(R.id.con_button);
mBIPEditText = (EditText) findViewById(R.id.ip_edittext);
mBPortEditText = (EditText) findViewById(R.id.port_edittext);
mBOpenButton = (Button) findViewById(R.id.open_button);
mBCloseButton = (Button) findViewById(R.id.close_button);
mBPwmZButton = (Button) findViewById(R.id.PwmZ_button);
mBPwmFButton = (Button) findViewById(R.id.PwmF_button);
mBContButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(socket == null) {
IpString = mBIPEditText.getText().toString();
portint = Integer.valueOf(mBPortEditText.getText().toString());
str = "";
serverThreadTCP = new ServerThreadTCP();
serverThreadTCP.start();
}else if(socket != null && socket.isConnected())
{
try {
socket.close();
socket = null;
mBContButton.setText("连接WiFi");
Toast.makeText(MainActivity.this, "连接以关闭", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
mBOpenButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (socket != null)
{
str = "K\r\n";
new ServerThreadTCP().start();
}
else
{
Toast.makeText(MainActivity.this, "请先建立socket连接", Toast.LENGTH_SHORT).show();
}
}
});
mBCloseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (socket != null)
{
str = "G\r\n";
new ServerThreadTCP().start();
}
else
{
Toast.makeText(MainActivity.this, "请先建立socket连接", Toast.LENGTH_SHORT).show();
}
}
});
mBPwmZButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (socket != null)
{
str = "Z\r\n";
new ServerThreadTCP().start();
}
else
{
Toast.makeText(MainActivity.this, "请先建立socket连接", Toast.LENGTH_SHORT).show();
}
}
});
mBPwmFButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (socket != null)
{
str = "F\r\n";
new ServerThreadTCP().start();
}
else
{
Toast.makeText(MainActivity.this, "请先建立socket连接", Toast.LENGTH_SHORT).show();
}
}
});
}
private class ConnectSeverThread extends Thread {
private String ip;
private int port;
public ConnectSeverThread(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void run() {
try {
socket = new Socket(ip, port);
socket.setSoTimeout(5000);
outputStream = socket.getOutputStream();
runOnUiThread(new Runnable() {
@Override
public void run() {
mBContButton.setText("关闭WiFi");
Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
}
});
}
}
}
private class ServerThreadTCP extends Thread
{public void run()
{OutputStream outputStream = null;
InputStream inputStream = null;
try {
if(socket == null) {
socket = new Socket(IpString, portint);
}
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
byte data[] = str.getBytes();
outputStream.write(data, 0, data.length);
outputStream.flush();
byte buffer[] = new byte[1024 * 4];
int temp = 0;
runOnUiThread(new Runnable() {
@Override
public void run() {
mBContButton.setText("关闭WiFi");
Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
}
});
while ((temp = inputStream.read(buffer)) != -1)
{
System.out.println(new String(buffer, 0, temp));
}
} catch (Exception e)
{System.out.println(e);} finally
{
try {
inputStream.close();
outputStream.close();
socket.close();
socket = null;
mBContButton.setText("连接WiFi");
Toast.makeText(MainActivity.this, "连接已关闭", Toast.LENGTH_SHORT).show();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
|
|