【毕业设计】基于单片机的桌面炫酷律动灯条 -物联网 嵌入式 单片机

187 篇文章 115 订阅
151 篇文章 37 订阅


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于单片机的桌面炫酷律动灯条

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


1 简介

esp8285芯片ESP-01F模块为主控,MAX9814音频采集模块,WS2812 2020rgb灯珠,Arduino编程环境简单制作一个律动灯条。

2 主要器件

直接用MAX9814音频采集模块焊在板子上,效果非常好。

esp8266模块所以可以做http服务,所以就可以做个页面把所有参数都拿出来自定义。

光绘棒部分会专门再做个长的,这里就没讲了,原理很简单就是按图像像素点的行或者列顺序修改灯珠对应的颜色就行了。

  • esp8285芯片ESP-01F模块
  • MAX9814音频采集模块
  • WS2812 2020rgb灯珠

3 实现效果

整体展示
在这里插入图片描述

可调RGB
在这里插入图片描述

灯光效果随音乐律动
在这里插入图片描述

4 设计原理

模块简介
esp8285 和 ESP8266一样,都是由乐鑫公司开发,提供了⼀套⾼度集成的 Wi-Fi SoC 解决⽅案,其低功耗、紧凑设计和⾼稳定性可以满⾜⽤户的需求。
esp8266的代码同样适合在esp8285上运行的,也就是支持nonos和 rtos。

MAX9814音频采集模块
通过MAX9814进行音频采集模拟值,上面标注了DC offset(直流偏移):1.2v。而esp8285或者8266的ADC采样只能接收1v,所以采集的ADC信号要进行串联电阻分压。
在这里插入图片描述

主要原理图
在这里插入图片描述

5 部分核心代码

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#include<FastLED.h>
#include<MegunoLink.h>  //滤波库 https://www.megunolink.com/documentation/arduino-library/
#include<Filter.h>      //项目-加载库-库管理 搜索 MegunoLink 安装

#ifndef STASSID
#define STASSID "********"
#define STAPSK  "********"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);
// define necessary parameters
#define N_PIXELS  30   //led灯珠数量
#define MIC_PIN   A0   //音频采集模块接口
#define LED_PIN   13   //led灯带接口
#define NOISE 60       //噪音底线
#define TOP   (N_PIXELS+2) 
#define LED_TYPE  WS2812
#define BRIGHTNESS  100   //灯珠亮度
#define COLOR_ORDER GRB

#define SW1 4    //按钮IO
#define SW2 0
#define SW3 5

CRGB leds[N_PIXELS];

uint16_t R[4]={255,0,0,0};
uint16_t G[4]={0,255,0,0};
uint16_t B[4]={0,0,255,0};
int lvl = 0, minLvl = 10, maxLvl = 256; // 设置最大最小限值

ExponentialFilter<long> ADCFilter(10,0);

String postForms() 
{
  String htmlCode = "<!DOCTYPE html><html>\n";
   htmlCode += "<head>\n";
   htmlCode += "<title>调色</title>\n";
   htmlCode += "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n";
   htmlCode += "<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0'/>\n";
   htmlCode += "<style>\n";
      htmlCode += "body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\n";
    htmlCode += "</style>\n";
  htmlCode += "</head>\n";
  htmlCode += "<body>\n";
    htmlCode += "<h1>输入RGB值</h1><br>\n";
    htmlCode += "<form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/\">\n";
      htmlCode += "R   G   B <br>\n";
      htmlCode += "0 \n";
      htmlCode += "<input type=\"text\" name=\"G0\" value= \"";
      htmlCode += R[0];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">\n";
      htmlCode += "<input type=\"text\" name=\"R0\" value= \"";
      htmlCode += G[0];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">\n";
      htmlCode += "<input type=\"text\" name=\"B0\" value= \"";
      htmlCode += B[0];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\"><br>\n";
      htmlCode += "1 \n";
      htmlCode += "<input type=\"text\" name=\"G1\" value= \"";
      htmlCode += R[1];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">\n";
      htmlCode += "<input type=\"text\" name=\"R1\" value= \"";
      htmlCode += G[1];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">\n";
      htmlCode += "<input type=\"text\" name=\"B1\" value= \"";
      htmlCode += B[1];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\"><br>\n";
      htmlCode += "2 \n";
      htmlCode += "<input type=\"text\" name=\"G2\" value= \"";
      htmlCode += R[2];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">\n";
      htmlCode += "<input type=\"text\" name=\"R2\" value= \"";
      htmlCode += G[2];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">\n";
      htmlCode += "<input type=\"text\" name=\"B2\" value= \"";
      htmlCode += B[2];
      htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\"><br>\n";
      htmlCode += "<input type=\"submit\" value=\"修改\"><br>\n";
      
    htmlCode += "</form>\n";

  htmlCode += "</body>\n";
htmlCode += "</html>\n";
return htmlCode;
}

void handleRoot() {
  String message = "";
  
  for (uint8_t i = 0; i < server.args(); i++) {
    
   message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  if(server.args()>0){
    R[0] = (server.arg(0)).toInt();
    G[0] = (server.arg(1)).toInt();
    B[0] = (server.arg(2)).toInt();
    R[1] = (server.arg(3)).toInt();
    G[1] = (server.arg(4)).toInt();
    B[1] = (server.arg(5)).toInt();
    R[2] = (server.arg(6)).toInt();
    G[2] = (server.arg(7)).toInt();
    B[2] = (server.arg(8)).toInt();
  }
  
  for(uint8_t i = 0; i < N_PIXELS; i++) {
    leds[N_PIXELS-1-i] = colour(i);
  }
  FastLED.show();
  server.send(200, "text/html", postForms());
  
}


void setup() {
  Serial.begin(115200);
  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(SW3, INPUT_PULLUP);

  server.on("/", handleRoot);

  server.begin();
  Serial.println("HTTP server started");
  
  FastLED.addLeds<LED_TYPE,LED_PIN,COLOR_ORDER>(leds,N_PIXELS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(BRIGHTNESS);
}

uint16_t  samnum;
int maxtemp;
uint8_t sta,mode_num;

void loop() {

  switch(sta){
    case 0:
      int n, height;
      n = analogRead(MIC_PIN);
      n = abs(512 - n);
      n = (n <= NOISE) ? 0 : abs(n - NOISE);
      ADCFilter.Filter(n);
      lvl = ADCFilter.Current();
//      Serial.print("n: ");
//      Serial.print(n);
//      Serial.print(" lvl: ");
//      Serial.print(lvl);
//      Serial.print(" maxLvl: ");
//      Serial.println(maxLvl);
      
      if(samnum<200){
        maxtemp = max(maxtemp,lvl);
        samnum++;
      }else{
        if(maxtemp < 50){
          maxLvl = 50;
        }else{
          maxLvl = maxtemp;
        }
        maxtemp = 0;
        samnum = 0;
      }
    
      height = TOP * (lvl - minLvl) / (long)(maxLvl - minLvl);
      if(height < 0L) height = 0;
      else if(height > TOP) height = TOP;
      
      switch(mode_num){
        case 0:
          for(uint8_t i = 0; i < N_PIXELS; i++) {
            if(i >= height) leds[N_PIXELS-1-i] = CRGB(0,0,0);
            else leds[N_PIXELS-1-i] = colour(i);
          }
        break;
        case 1:
          for(uint8_t i = 0; i < N_PIXELS/2; i++) {
            // turn off LEDs above the current level
            if(i >= height/2) {
              leds[N_PIXELS/2-1-i] = CRGB(0,0,0);
              leds[N_PIXELS/2+i] = CRGB(0,0,0);
            }
            
            else {
              leds[N_PIXELS/2-1-i] = colour(i);
              leds[N_PIXELS/2+i] = colour(i);
            }
          }
        break;
      }

      
      FastLED.show();

    break;
    
    case 1:
      server.handleClient();

    break;
  }

  if(digitalRead(SW1) == LOW){
    delay(5);
    if(digitalRead(SW1) == LOW){
      sta++;
      if(sta>1)sta = 0;

      while(digitalRead(SW1) == LOW);
      if(sta == 1){  
        for(uint8_t i = 0; i < N_PIXELS; i++) {
          leds[N_PIXELS-1-i] = CRGB(0,0,0);
        }
        FastLED.show();
        WiFi.mode(WIFI_STA);
        WiFi.begin(ssid, password);
        Serial.println("");
      
        // Wait for connection
        int j ;
        while (WiFi.status() != WL_CONNECTED) {
          delay(500);
          Serial.print(".");
           leds[N_PIXELS-1-j] = CRGB(255,0,0);
           FastLED.show();
           j++;

        }
        Serial.println("");
        Serial.print("Connected to ");
        Serial.println(ssid);
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
        for(uint8_t i = 0; i < N_PIXELS; i++) {
          leds[N_PIXELS-1-i] = colour(i);
        }
        FastLED.show();
      }
    }
  }

  
  if(digitalRead(SW2) == LOW){
    delay(5);
    if(digitalRead(SW2) == LOW){
      mode_num++;
      if(mode_num>1)mode_num = 0;
      while(digitalRead(SW2) == LOW);
    }
  }

}
  
}


6 最后

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于STM32单片机的智能家居物联网平台设计可以分为硬件设计和软件设计两个方面。 硬件设计方面,我们可以选择STM32系列单片机作为主控芯片,并搭配各种传感器模块和执行器模块,如温湿度传感器、光照传感器、人体感应模块、继电器等。这些模块可以通过IO口或者串口与主控芯片相连,实现数据的采集和控制功能。此外,还可以加入WiFi模块或蓝牙模块,实现与用户手机或其他智能终端的通信。 软件设计方面,需要首先编写底层驱动程序,包括对各种传感器和执行器的驱动程序,和与主控芯片的通信模块。然后,在操作系统层面上,可以选择基于FreeRTOS的操作系统,来管理各个任务的执行和优先级。在应用层面上,可以设计一个用户友好的界面,通过手机APP或者网页来进行智能家居的控制,包括室内温湿度的显示与控制,光的控制,窗帘的控制等等。同时,可以利用物联网技术,将各个设备连接到一个云平台上,实现跨地域的远程控制和实时监测功能。 整个设计过程需要考虑到系统的稳定性和可靠性,需要进行充分的测试和验证。此外,还可以根据用户的需求进行扩展和改进,比如加入人脸识别技术,实现自动识别用户身份并做出相应的操作。基于STM32单片机的智能家居物联网平台设计,将为用户带来更方便、安全、舒适的居住环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值