|
多功能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();
}
}
}
}
}
|
-
-
-
程序.7z
2022-9-7 22:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
212.91 KB, 下載次數: 46, 下載積分: 黑幣 -5
stm32控制程序
-
-
多功能LED電路圖PCB文件.7z
2022-9-7 22:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
3.74 MB, 下載次數: 53, 下載積分: 黑幣 -5
原理圖+PCB
-
-
app-release.rar
2022-1-25 05:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.93 MB, 下載次數: 31, 下載積分: 黑幣 -5
apk文件
|