色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于啟明6M5開發板的智能門鎖設計

瑞薩MCU小百科 ? 來源:瑞薩MCU小百科 ? 2023-12-18 12:30 ? 次閱讀

本項目是基于啟明6M5開發板設計一個門鎖系統,通過板載ESP8266網絡將驗證碼發送至云端,用戶通過手機上接受到的驗證碼打開門鎖。項目功能演示如下:

硬件設計

拓展板原理圖:

dabd800e-9d5a-11ee-8b88-92fbcf53809c.png

繪制拓展板時計劃使用到液晶屏,攝像頭和指紋模塊,揚聲器等外設,所以繪制PCB時都加上去了,改了兩次板后依舊還有些硬件問題沒解決,加上軟件沒調好,目前只能通過使用觸摸屏來驅動舵機。圖中的GD32f103芯片打算作為攝像頭OV7670和液晶屏的中轉,由于我使用的OV7670不帶緩存,故打算用GD32將16位的圖像數據通過8080時序直接傳輸給LCD,目前還沒調通該部分。

二 軟件設計

該系統中主要使用到了timer控制舵機完成開門和及時關門的操作,使用RNG寄存器實現得到隨機的開鎖密碼,通過ESP8266傳輸給手機設備,使用RTC更新當前時間。

dad92066-9d5a-11ee-8b88-92fbcf53809c.png

(1)ESP8266
該模塊使用Arduino軟件進行編程,主要功能為獲取時間和MQTT協議通訊,具體代碼如下:

上下滑動查看完整內容

左右滑動即可查看完整代碼

#include 
#include 
#include 
#include 
#include 


const char *ssid   = "CMCC-416";//
const char *password = "12345678";//
const char* mqtt_server = "114.55.65.118";//MQTT服務器地址


char msg[200];
int msg_ind=0;


WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp1.aliyun.com", 60*60*8, 30*60*1000);


WiFiClient espClient;
PubSubClient client(espClient);


void setup(){
 Serial.begin(115200);
 WiFi.begin(ssid, password);


 while ( WiFi.status() != WL_CONNECTED ) {
  delay ( 500 );
  Serial.print ( "." );
 }


 client.setServer(mqtt_server, 1883);//設置MQTT服務器和端口號
 client.setCallback(callback);  //設置MQTT回傳函數
 timeClient.begin();
 while (!client.connect("ESP8266Client")) {
  Serial.print ( "-" );
  delay ( 500 );
 }//以ESP8266Client身份連接MQTT服務器
 Serial.print ("MQTTsuccess" );
 client.subscribe("RA6M5/1");
}


void callback(char* topic, byte* payload, unsigned int length) {
 if (strstr((char*)payload,(char*)"askInfo")!=NULL)//從單片機中獲取當前信息
 {
  Serial.print("ANDROID_ASKINFO
");
 }
}


void loop() {
 client.loop();//循環調用回傳函數,當訂閱的主題有新消息時能馬上進入callback函數
 while(Serial.available()>0)//讀取串口
 {
  char recvData = Serial.read();
  msg[msg_ind++] = recvData;//逐個字符寫入串口接收緩存區
  delay(100);
  if (recvData=='
'){
//   Serial.print("Time:");
//   Serial.print(msg);
   if (strstr(msg,(char*)"{"))//當串口接受的最后一個字符是'
'結尾時,對所有緩存區域進行處理
   {
    if (client.connect("ESP8266Client")) {//以ESP8266Client身份連接MQTT服務器
     client.publish("RA6M5/2", msg,msg_ind-1);  //將緩存區數據以RA6M5/2主題發布
    }
    msg_ind=0;//刷新串口接收緩存
   }
   else if (strstr(msg,(char*)"GETTIME")){
    timeClient.update();
    //獲取時間戳
    //unsigned long epochTime = timeClient.getFormattedTime();
    Serial.print("Time:");
    Serial.println(timeClient.getEpochTime());
    msg_ind=0;//刷新串口接收緩存
   }
   else if (strstr(msg,(char*)"WIFISTATE")){
    if ( WiFi.status() == WL_CONNECTED ) {
     int rss=WiFi.RSSI();
     if (rss<=0&&rss>=-50)
      Serial.println ( "WIFI:3" );
     else if (rss<=-50&&rss>=-70)
      Serial.println ( "WIFI:2" );
     else if (rss<=-70&&rss>=-80)
      Serial.println ( "WIFI:1" );
     else if (rss<=-80&&rss>=-100)
      Serial.println ( "WIFI:0" );
    }else{
     Serial.println ( "WIFI:No" );
    }
   }
  }
 }
}

(2)上位機部分
該部分使用Android Studio編寫,主要代碼如下:

上下滑動查看完整內容

左右滑動即可查看完整代碼

public class MainActivity extends AppCompatActivity {
  private static IntentFilter action;
  RecyclerView recycler;


  private final String payloadJson1="{"ParkingState":1}";


  final int POST_DEVICE_PROPERTIES_SUCCESS = 1002;
  final int POST_DEVICE_PROPERTIES_ERROR = 1003;
  final int UPDATE_UI = 1004;
  private MqttClient mqttClient=null;
  private String responseBody = "";
  private static final String TAG =MainActivity.class.getSimpleName();
  private ArrayList datas = new ArrayList<>();
  private String temper_str="未知";
  private String humdity_str="未知";
  private String passwd_str="未知";
  private dataBean bean = new dataBean();


  MyAdapter adapter;


  private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      switch (msg.what) {
        case POST_DEVICE_PROPERTIES_SUCCESS:
          showToast("發送數據成功");
          break;
        case POST_DEVICE_PROPERTIES_ERROR:
          showToast("post數據失敗");
          break;
        case UPDATE_UI:
          SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd
HHss");
          Date curDate = new Date(System.currentTimeMillis());
          String str_time = formatter.format(curDate);
          datas.clear();
          bean = new dataBean("濕度",humdity_str,str_time,getResources().getDrawable(R.drawable.ic_humdity, null));
          datas.add(bean);
          bean = new dataBean("溫度",temper_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
          datas.add(bean);
          bean = new dataBean("驗證碼",passwd_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
          datas.add(bean);
          adapter.notifyDataSetChanged();
          break;


      }
    }
  };




  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    recycler = findViewById(R.id.recyclerView);


    RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
    refreshLayout.setRefreshHeader(new ClassicsHeader(this));
     refreshLayout.setRefreshFooter(new ClassicsFooter(this));
    refreshLayout.setOnRefreshListener(new OnRefreshListener() {
      @Override
      public void onRefresh(RefreshLayout refreshlayout) {
        refreshlayout.finishRefresh(2000/*,false*/);//傳入false表示刷新失敗
        mHandler.postDelayed(() -> postDeviceProperties1(), 1000);
      }
    });
    refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
      @Override
      public void onLoadMore(RefreshLayout refreshlayout) {
        refreshlayout.finishLoadMore(2000/*,false*/);//傳入false表示加載失敗
        mHandler.postDelayed(() -> postDeviceProperties1(), 1000);
      }
    });


    new Thread(() -> initMQTTClient()).start();


    SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd
HHss");
    Date curDate = new Date(System.currentTimeMillis());
    String str_time = formatter.format(curDate);


    bean = new dataBean("濕度",temper_str,str_time,getResources().getDrawable(R.drawable.ic_humdity, null));
    datas.add(bean);
    bean = new dataBean("溫度",humdity_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
    datas.add(bean);
    bean = new dataBean("驗證碼",passwd_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
    datas.add(bean);




    //適配器
    adapter = new MyAdapter(this, datas);
    //布局
    LinearLayoutManager manager = new LinearLayoutManager(this);
    //設置布局
    recycler.setLayoutManager(manager);
    //設置動畫
    recycler.setItemAnimator(new DefaultItemAnimator());
    //設置適配器
    recycler.setAdapter(adapter);




  }


  private void initMQTTClient() {


    try {
      // cn-shanghai
      String targetServer ="tcp://114.55.65.118:1883";
      String mqttclientId = "RA6M5_Android1";
      String mqttUsername = "RA6M5_Android_User1";
      String mqttPassword = "123456";
      connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);
    } catch (Exception e) {
      e.printStackTrace();
      responseBody = e.getMessage();
      mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);
    }
  }


  public void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception {


    MemoryPersistence persistence = new MemoryPersistence();
    mqttClient = new MqttClient(url, clientId, persistence);
    MqttConnectOptions connOpts = new MqttConnectOptions();
    // MQTT 3.1.1
    connOpts.setMqttVersion(4);
    connOpts.setAutomaticReconnect(true);
    connOpts.setCleanSession(true);


    connOpts.setUserName(mqttUsername);
    connOpts.setPassword(mqttPassword.toCharArray());
    connOpts.setKeepAliveInterval(60);


    mqttClient.connect(connOpts);
    mqttClient.setCallback(new MqttCallback() {
      @Override
      public void connectionLost(Throwable cause) {
        Log.e(TAG, "cause ---> " + cause);
      }


      @Override
      public void messageArrived(String topic, MqttMessage message) throws Exception {
        Log.e(TAG, "topic ---> " + topic + "    message--->" + message);
        if (topic.equals("RA6M5/2")){
          String mqtt_str = new String(message.getPayload());
          JSONObject json = new JSONObject(mqtt_str);
          temper_str = json.getString("temper");
          humdity_str = json.getString("humdity");
          passwd_str = json.getString("passwd");
          mHandler.sendEmptyMessage(UPDATE_UI);
          Log.e(TAG, "update--finish ");


        }
      }


      @Override
      public void deliveryComplete(IMqttDeliveryToken token) {
        Log.e(TAG, "token ---> " + token);
      }
    });
    mqttClient.subscribe("RA6M5/2");
    Log.d(TAG, "connected " + url);
  }


  private void showToast(String msg) {
    Toast.makeText(MainActivity.this, msg,Toast.LENGTH_SHORT).show();
  }


  private void postDeviceProperties1() {
    try {


      Random random = new Random();


      //上報數據
      String payload = "askInfo";
      responseBody = payload;
      MqttMessage message = new MqttMessage(payload.getBytes("utf-8"));
      message.setQos(1);


      String pubTopic = "RA6M5/1";
      mqttClient.publish(pubTopic, message);
      Log.d(TAG, "publish topic=" + pubTopic + ",payload=" + payload);
      mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_SUCCESS);
    } catch (Exception e) {
      e.printStackTrace();
      responseBody = e.getMessage();
      mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);
      Log.e(TAG, "postDeviceProperties error " + e.getMessage(), e);
    }
  }
}

(3)單片機部分
該部分使用Android Studio編寫,主要代碼如下:

1、屏幕顯示部分

上下滑動查看完整內容

左右滑動即可查看完整代碼

void LCD_thread_entry(void * pvParameters)
{
        uint32_t lValueToRece;
        uint16_t pos_x=0,pos_y=0;
        EventBits_t Eventbits;
        BaseType_t err = pdFALSE;
        unsigned char touch_vals[4];
        unsigned char touch_tmp=0;
        xEventGroupClearBits(g_new_event_LCD,0x7);
        xEventGroupSetBits(g_new_event_LCD,0x1);
        FSP_PARAMETER_NOT_USED(pvParameters);
        R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg);
        LCD_Init();
        WIFI_Init();
        PWM_Init();
        R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
        R_GPT_Start(&g_timer0_ctrl);
        R_GPT_Disable(&g_timer0_ctrl);
        LCD_Clean(BLUE);//BLUE
        Draw_Square_Back(18,180,100,56,BRRED,LIGHTBLUE,array_renlian);
        Draw_Square_Back(18,240,100,56,BRRED,LIGHTBLUE,array_mima);
//        LCD_ShowPic(18,180,27,40,gImage_temp,BLUE);
//        LCD_ShowPic(18,240,27,40,gImage_humdity,BLUE);
        R_SCI_UART_Write(&g_uart9_wifi_ctrl, (const uint8_t*)"GETTIME
", 8);
        mbedtls_platform_setup(&ctx);
        RM_PSA_CRYPTO_TRNG_Read(passwd_Byte+6,6,&passwd_num);
        /* TODO: add your own code here */
        while(1)
        {
            Eventbits = xEventGroupGetBits(g_new_event_LCD);
            if ((Eventbits&0x1)==0x1){//顯示時間
                //更新wifi數據
                wifi_analysis();
                DHT11_Read();
                err = xQueueReceive(g_touch_queue,&lValueToRece,20);        
                if (err==pdTRUE){
                        pos_x = lValueToRece>>16;
                        pos_y = lValueToRece & 0xffff;
                        if ((pos_x>18)&&(pos_x<118))
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if ((pos_y>180)&&(pos_y<236))
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?taskENTER_CRITICAL();
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LCD_Fill(0,0,239,319,WHITE);//BLUE
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?taskEXIT_CRITICAL();
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else if ((pos_y>240)&&(pos_y<316))
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?xSemaphoreGive(g_rtc_binSem);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?xEventGroupClearBits(g_new_event_LCD,0x7);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?xEventGroupSetBits(g_new_event_LCD,0x4);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?taskENTER_CRITICAL();
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LCD_Fill(0,0,239,319,WHITE);//BLUE
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LCD_Disp_KeyBoard();
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?getKeyBoardTRNG();
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?taskEXIT_CRITICAL();
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
 ? ? ? ? ? ? ? ? ? ? ? ?}else if((Eventbits&0x4)==0x4){


 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?err = xQueueReceive(g_touch_queue,&lValueToRece,20);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (err==pdTRUE){
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?touch_tmp ?= LCD_Read_KeyBoard((unsigned short)(lValueToRece>>16),lValueToRece&0xffff);
                    if (touch_tmp==0xff){
                        minLCD_Key_Loc();
                    }else if (touch_tmp<10)
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (getLCD_Key_Loc()>0)
                        touch_vals[getLCD_Key_Loc()-1] = touch_tmp;
                    }
                    LCD_Disp_Passwd(touch_vals,getLCD_Key_Loc());
                    if (getLCD_Key_Loc()==4)
                    {
                        //校驗
                        if ((touch_vals[0]==(passwd_Byte[0]-'0'))
                            &&(touch_vals[1]==(passwd_Byte[1]-'0'))
                            &&(touch_vals[2]==(passwd_Byte[2]-'0'))
                            &&(touch_vals[3]==(passwd_Byte[3]-'0'))
                            )
                        {
                            lockState=false;
                            R_GPT_Enable(&g_timer0_ctrl);
                            xEventGroupClearBits(g_new_event_LCD,0x7);
                            xEventGroupSetBits(g_new_event_LCD,0x1);
                            taskENTER_CRITICAL();
                            LCD_Fill(0,0,239,319,BLUE);//BLUE
                            taskEXIT_CRITICAL();
                            xSemaphoreGive(g_flush_semaphore);
                            R_SCI_UART_Write(&g_uart9_wifi_ctrl, (const uint8_t*)"GETTIME
", 8);
                        }
                    }
                }


            }
            if (lockState){//關著
                PWM_Update(5);
            }
            else{
                PWM_Update(10);//打開
            }
        }
}






void uart9_wifi_callback(uart_callback_args_t * p_args)
{
     switch(p_args->event)
     {
     case UART_EVENT_RX_CHAR:
                    wifi_rece_buff[wifi_rece_len++] = p_args->data&0xff;
                    if (p_args->data=='
'){
                        flag_wifi_rece=true;
                    }                
      break;
         case UART_EVENT_TX_COMPLETE:


            break;
     default:
      break;
   }
}


void lock_timer0_callback(timer_callback_args_t * p_args)
{
    if (TIMER_EVENT_CYCLE_END == p_args->event)
    {
            lockState=true;
            R_GPT_Disable(&g_timer0_ctrl);
    }



2、觸摸部分

上下滑動查看完整內容

左右滑動即可查看完整代碼

void Touch_thread_entry(void * pvParameters)
{
        FSP_PARAMETER_NOT_USED(pvParameters);
        bool Touch_flag_time=true;
        bsp_io_level_t state;
        fsp_err_t err = FSP_SUCCESS;
        /* Open ICU module */
        err = R_ICU_ExternalIrqOpen(&g_external_irq4_ctrl, &g_external_irq4_cfg);
        /* 允許中斷 */
        err = R_ICU_ExternalIrqEnable(&g_external_irq4_ctrl);
        /* TODO: add your own code here */
        while(1)
        {


            if (flag_touch_start){
                if (Touch_num==6){
                    uint32_t lValueToSend;
                    flag_touch_start = false;
                    Touch_coordinate_xsum = Touch_coordinate_xsum-Touch_coordinate_xmax-Touch_coordinate_xmin;
                    Touch_coordinate_xsum >>=2;
                    Touch_coordinate_ysum = Touch_coordinate_ysum-Touch_coordinate_ymax-Touch_coordinate_ymin;
                    Touch_coordinate_ysum >>=2;
                    Touch_corrdinate_pixel(Touch_coordinate_xsum,Touch_coordinate_ysum);
                    lValueToSend = Touch_coordinate_xpix;
                    lValueToSend <<=16;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?lValueToSend |= Touch_coordinate_ypix;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?xQueueSendToBack(g_touch_queue,&lValueToSend,100000);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_num=0;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?vTaskDelay(100);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?taskENTER_CRITICAL(); ? ? ? ?//進入基本臨界區
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?touch_curr_x = Touch_Write_CMD(READ_CHANNEL_X);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?touch_curr_y = Touch_Write_CMD(READ_CHANNEL_Y);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?taskEXIT_CRITICAL(); 
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (Touch_num==0)
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_xmax=touch_curr_x;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_xmin=touch_curr_x;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_ymax=touch_curr_y;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_ymin=touch_curr_y;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_xsum = touch_curr_x;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_ysum = touch_curr_y;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_average(touch_curr_x,0);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_coordinate_average(touch_curr_y,1);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Touch_num++;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
 ? ? ? ? ? ? ? ? ? ? ? ?}else{
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (Touch_flag_time)
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R_IOPORT_PinWrite(&g_ioport_ctrl, LCD_SCK, BSP_IO_LEVEL_LOW);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?else
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R_IOPORT_PinWrite(&g_ioport_ctrl, LCD_SCK, BSP_IO_LEVEL_HIGH);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R_IOPORT_PinRead(&g_ioport_ctrl, LCD_IRQ, &state);
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (state==BSP_IO_LEVEL_LOW){
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?flag_touch_start=true;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?vTaskDelay(10);
 ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? //退出基本臨界區
 ? ? ? ? ? ? ? ? ? ? ? ?vTaskDelay(10);
// ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?xSemaphoreTake(g_touch_binary_semaphore,portMAX_DELAY);
 ? ? ? ? ? ? ? ?}
}

3、RTC部分

上下滑動查看完整內容

左右滑動即可查看完整代碼

void RTC_thread_entry(void * pvParameters)
{
    FSP_PARAMETER_NOT_USED(pvParameters);
    EventBits_t Eventbits;
    BaseType_t err = pdFALSE;
    /* TODO: add your own code here */
    while(1)
    {
        Eventbits = xEventGroupGetBits(g_new_event_LCD);
        if ((Eventbits&0x1)==0x1)//顯示時間
        {
            xSemaphoreTake(g_rtc_binSem,portMAX_DELAY);
            taskENTER_CRITICAL();
            Time_Update();
            taskEXIT_CRITICAL();
            err = xSemaphoreTake(g_flush_semaphore,20);
            if (err==pdTRUE)
            {
                taskENTER_CRITICAL();
                Draw_Square_Back(18,180,100,56,BRRED,LIGHTBLUE,array_renlian);
                Draw_Square_Back(18,240,100,56,BRRED,LIGHTBLUE,array_mima);
                taskEXIT_CRITICAL();
            }
        }
        else{
            if (first_Disp){
                LCD_Fill(0,131,239,50,WHITE);
                Draw_Square(10,140,60,50,RED,GREEN,4);//4
                Draw_Square(90,140,60,50,RED,GREEN,5);//5
                Draw_Square(170,140,60,50,RED,GREEN,6);//6
                first_Disp--;
            }
            vTaskDelay(1000);
        }
    }
}




void rtc_lcd_callback(rtc_callback_args_t * p_args)
{
    switch (p_args->event)
     {
         /*若是周期中斷,則更新日期*/
         case RTC_EVENT_PERIODIC_IRQ:


            /*獲取當前時間*/
            R_RTC_CalendarTimeGet (g_rtc_lcd.p_ctrl, lcd_time);
            xSemaphoreGiveFromISR(g_rtc_binSem,NULL);
            break;
         default:
            break;
     }
}

三 項目效果圖

daeecdda-9d5a-11ee-8b88-92fbcf53809c.jpg

daf987d4-9d5a-11ee-8b88-92fbcf53809c.png

db1f3bf0-9d5a-11ee-8b88-92fbcf53809c.png

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 原理圖
    +關注

    關注

    1297

    文章

    6338

    瀏覽量

    233814
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17123

    瀏覽量

    350992
  • 開發板
    +關注

    關注

    25

    文章

    5032

    瀏覽量

    97375
  • ESP8266
    +關注

    關注

    50

    文章

    962

    瀏覽量

    44964
  • 智能門鎖
    +關注

    關注

    17

    文章

    1856

    瀏覽量

    43136

原文標題:【瑞薩RA MCU創意氛圍賽作品賞析】項目18——智能門鎖

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于啟明6M5開發板的無線環境監測小車系統設計

    本項目旨在基于啟明6M5開發板設計一個無線環境監測小車系統,用于監測實驗室環境,用戶能夠通過藍牙對小車進行控制,并通過onenet云平臺進行查看當前環境數據以及歷史數據。
    的頭像 發表于 12-11 12:22 ?945次閱讀
    基于<b class='flag-5'>啟明</b><b class='flag-5'>6M5</b><b class='flag-5'>開發板</b>的無線環境監測小車系統設計

    【免費試用16期】野火啟明6M5開發板

    ------------------------------------------------------------------------為了讓電子發燒友社區開發者們定期體驗試用不同的開發板,現推出每周一期開發板免費試用活
    發表于 11-24 11:37

    【野火啟明6M5開發板體驗】野火啟明開發板和瑞薩RA MCU介紹

    首先感謝電子發燒友和野火,已經收到野火啟明6M5開發板。野火啟明6M5開發板包裝野火
    發表于 12-14 22:31

    【野火啟明6M5開發板體驗】開箱

    感謝非常感謝野火、電子發燒友論壇,把這次難得的試用機會給了我。開箱:包裝相當的專業:里面有海棉保護加防靜電包裝,附了一根typeC數據線。開發板正面開發板簡介野火啟明6M5
    發表于 12-15 13:22

    【野火啟明6M5開發板體驗】野火啟明6M5開箱

    感謝電子發燒友和野火,使本人能夠獲得機會對野火啟明6M5開發板進行測評,由于疫情的原因,雖然使用的是順豐快遞,但是依然用了將近六天的時間才收到快遞。收到后便立刻打開,有各位同學一起分享。本人也參加
    發表于 12-18 16:05

    【野火啟明6M5開發板體驗】與野火啟明6M5開發板的第一次親密接觸

    首先感謝野火 & elecfans給與的機會。野火啟明6M5開發板自從發布起就一直關注,到b站的發布,不過很遺憾沒有抽中。一、開箱白色的包裝盒,Renesas標注其上。黑色的PCB
    發表于 12-18 22:14

    【野火啟明6M5開發板體驗】開箱+認識開發板+資料

    按鍵檢測29. WiFi——模塊通訊尺寸:3、資料:*附件:[野火EmbedFire]《瑞薩RA系列FSP庫開發實戰指南——基于野火啟明6M5開發
    發表于 12-20 23:28

    【野火啟明6M5開發板體驗】1 RA6M5開發環境搭建

    開發環境:IDE:MKD 5.30開發板:野火啟明6M5開發板MCU:R7FA6M5BH3CFC
    發表于 12-21 22:49

    【野火啟明6M5開發板體驗】基于野火啟明6M5的可調頻正弦波發生器

    1、【野火啟明6M5開發板體驗】野火啟明6M5開箱:https://bbs.elecfans.com/jishu_2324111_1_1.h
    發表于 12-22 11:54

    【野火啟明6M5開發板體驗】測試ESP8266收發數據

    野火啟明6M5開發板,載了ESP8266,這樣可以方便的進行聯網,記得ESP8266是我進入單片機接觸到的最好用的芯片之一。但是,我原來做的大都是arduino或者LUA,很少用到A
    發表于 12-24 08:27

    【野火啟明6M5開發板體驗】3、FreeRTOS+OLED

    1、【野火啟明6M5開發板體驗】野火啟明6M5開箱:https://bbs.elecfans.com/jishu_2324111_1_1.h
    發表于 12-26 09:11

    【野火啟明6M5開發板體驗】TinyMaix移植和mnist測試

    TinyMaix是面向單片機的超輕量級的神經網絡推理庫,即TinyML推理庫,可以在任意單片機上運行的輕量級深度學習模型。一、環境準備IDE:MKD 5.37開發板:野火啟明RA6M5開發板
    發表于 12-27 20:55

    【野火啟明6M5開發板體驗】1.開箱

    的串口通訊和給開發板供電。創建項目的過程就跳過了,這部分內容在[野火]瑞薩RA系列FSP庫開發實戰指南——基于野火啟明6M5開發板 有詳細的
    發表于 01-03 01:04

    【野火啟明6M5開發板體驗】UART+ADC

    本篇繼續測評野火啟明6M5開發板體驗UART+ADC。開發平臺還是以KEIL開發環境:IDE:MKD 5.37
    發表于 01-03 22:41

    【免費試用16期】野火啟明6M5開發板

    為了讓電子發燒友社區開發者們定期體驗試用不同的開發板,現推出每周一期開發板免費試用活動。 第十六期試用的樣品為 ?野火啟明6M5
    的頭像 發表于 12-06 08:15 ?1371次閱讀
    主站蜘蛛池模板: 国产剧情福利AV一区二区| 欧美另类一区| 无码人妻精品国产婷婷| 91国在线啪精品一区| 国产色婷婷精品人妻蜜桃成熟时| 欧美一区二区激情视频| 伊人久久大香线蕉综合99| 国产精品视频成人| 殴美黄色网| 91麻豆精品| 紧致肉肉高h| 校园男男高h小黄文| 岛国大片在线播放高清| 嗯啊快拔出来我是你老师视频| 亚洲视频中文| 国产亚洲999精品AA片在线爽| 日本孕妇大胆孕交| 99国产精品欲AV蜜桃臀麻豆 | 亚洲中久无码永久在线| 国产精品av| 肉动漫无码无删减在线观看| 9久久免费国产精品特黄| 老师掀开短裙让我挺进动态| 亚洲免费观看在线视频| 国产三级视频在线| 神马伦理不卡午夜电影| 超碰在线vip| 欧美一级做a爰片免费| 99视频精品全部免费 在线| 伦理79电影网在线观看| 永久免费精品精品永久-夜色| 狠狠鲁快播| 亚洲精品国产在线观看| 国产亚洲精品看片在线观看 | 国产精品人成在线播放新网站| 日韩高清一区二区三区不卡| H厨房灌草莓| 欧美中文字幕一区二区三区| 99久久伊人一区二区yy5o99| 免费精品国偷自产在线| 5g天天奭视频|