<em id="ri2my"></em>
  • <em id="ri2my"></em>
    <em id="ri2my"><label id="ri2my"><nav id="ri2my"></nav></label></em>
  • <em id="ri2my"><label id="ri2my"></label></em>
    <div id="ri2my"></div>
    1. <em id="ri2my"><label id="ri2my"></label></em>
    2. <em id="ri2my"><ol id="ri2my"></ol></em>
      <em id="ri2my"></em>

      1. 求助!esp8266+重力傳感不能同時工作。

        作者:往兮321 | 更新時間:2020-05-12 | 瀏覽量:675

        ESP8266+重力傳感HX711芯片 使用論壇的控制LED代碼合成后,可以看到設備在線狀態,稱重也可以正常工作, 但設備對話時就沒有反應 。  兩個代碼分開時都能運行, 合起來就不行了,小白一個,大神能說詳細點不。。

        源代碼 如下:  

         

        /*
         * 按鈕按下開始指紋檢測,成功發送信息,并LED閃爍,lock開啟;失敗發送信息報警;
         * lock開啟后檢測開關,按下開關,lock關閉; 
         * 發送open指紋檢測開鎖;發送new添加指紋;發送stop關閉lock;發送play打開lock;
         * 檢測到物品后,發送信息提示;
         * 壓力HX711:VCC接5V、SCK接A0,DT接A1、GND接地;模塊紅黑白綠接E+E-A-A+;
         * wifi8266:VCC接3.3V、GND接地、TXD接0、RXD接1;
         * 指紋AS608:VCC接3.3V 紅線、TX接2 黃線、RX接3 白線、GND接地 黑線;
         * lock接11,通電不能大于1秒;LED接9;門鎖按鈕接10;
        */
        #include <Adafruit_Fingerprint.h>
        #include <aJSON.h>
        #include "HX711.h"
        #include <SoftwareSerial.h>

        // pin #2 is IN from sensor (GREEN wire)
        // pin #3 is OUT from arduino  (WHITE wire)
        SoftwareSerial mySerial(2, 3);
        //SoftwareSerial wifiSerial(0, 1);
        HX711 scale(A5, A4);
        Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);//mySerial = finger
        uint8_t id;

        String DEVICEID = "17388"; // 設備ID
        String  APIKEY = "63fb07905"; //APIKEY


        const int lock = 11;
        const int LED = 9;//提示燈
        unsigned long lastCheckStatusTime = 0; //記錄上次報到時間
        const unsigned long postingInterval = 40000; // 每隔40秒向服務器報到一次
        unsigned long checkoutTime = 0;//登出時間
        int sta;

        int button = 7;//門鎖按鈕

        boolean buttonState = 1;

        extern unsigned long HX711_Read(void);
        extern long Get_Weight();
        ///變量定義
        float Weight = 0;
        int HX711_SCK =A4;   ///     作為輸出口
        int HX711_DT= A5;    ///     作為輸入口
        long HX711_Buffer = 0;
        long Weight_Maopi = 0, Weight_Shiwu = 0;
        #define GapValue 240       ///該值需校準 每個傳感器都有所不同

        void setup()
        {  
         //初始化HX711的兩個io口   
        pinMode(HX711_SCK, OUTPUT);  ///SCK 為輸出口 ---輸出脈沖
        pinMode(HX711_DT, INPUT); ///  DT為輸入口  ---讀取數據
         Serial.begin(115200);
         Serial.print("Welcome to use!\n");
         delay(3000);    ///延時3秒  
         //獲取毛皮重量
         Weight_Maopi = HX711_Read(); 

          //WIFI
          pinMode(LED, OUTPUT);
          //Serial.begin(115200);//串口初始化(WIFI),硬件串口 rx=0,tx=1
          //Serial.begin(9600);
          finger.begin(9600);//指紋模塊初始化,軟件串口rx=2,tx=3
          //while (!Serial); 
          delay(5000);
          //Serial.println("\n\n指紋傳感器記錄");
          Serial.print("啟動成功!");
          //LOCK
          pinMode(lock, OUTPUT);
          pinMode(button, INPUT);
          
          


        }
         void loop()    ///  一直循環{}內容  ----- 同while(1){xxx}
        {
          //每一定時間查詢一次設備在線狀態,同時替代心跳
         if (millis() - lastCheckStatusTime > postingInterval) {
            checkStatus();
          }
          //checkout 50ms 后 checkin
         if ( checkoutTime != 0 && millis() - checkoutTime > 50 ) {
            checkIn();
            checkoutTime = 0;
          }
          //讀取串口信息 ||buttonState == HIGH
         buttonState = digitalRead(button);
         while (Serial.available()||buttonState == HIGH) {


            buttonState = digitalRead(button);
            if (buttonState == HIGH){
              Weight = Get_Weight();  //計算放在傳感器上的重物重量
              float kuaidi=float(Weight/1000);
              Serial.print(kuaidi,3);  //串口顯示重量,3意為保留三位小數
              Serial.print(" kg\n"); //顯示單位
              Serial.print("\n");  //顯示單位
              scale.power_down();              // 將ADC置于休眠模式
              if (kuaidi>1){
                Serial.print("有快遞,請指紋解鎖!");
                FingerprintIdentification();
                buttonState=0;
                delay(3000);
                return;

          }
              else if (kuaidi<1){
                Serial.print("鎖已開啟,可以放入快遞。");
                digitalWrite(lock, HIGH);
                delay(500); 
                digitalWrite(lock, LOW);        
                digitalWrite(LED, HIGH);
                delay(500);
                digitalWrite(LED, LOW);
                delay(500);
                digitalWrite(LED, HIGH);
                delay(500);
                digitalWrite(LED, LOW);
                sta = 3;
                buttonState=0;
                return;
                
          }

          
          } 

            String inputString = Serial.readStringUntil('\n');
            //檢測json數據是否完整
            int jsonBeginAt = inputString.indexOf("{");
            int jsonEndAt = inputString.lastIndexOf("}");
            if (jsonBeginAt != -1 && jsonEndAt != -1) {
              //凈化json數據
              inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
              int len = inputString.length() + 1;
              char jsonString[len];
              inputString.toCharArray(jsonString, len);
              aJsonObject *msg = aJson.parse(jsonString);
              processMessage(msg);
              aJson.deleteItem(msg);
            }

            //-

            

          
          }


          
        //--
          
         

         scale.power_up(); 


         
        }


         //稱重函數
        long Get_Weight()
        {
         HX711_Buffer = HX711_Read();    ///讀取此時的傳感器輸出值
         Weight_Shiwu = HX711_Buffer;     ///將傳感器的輸出值儲存
         Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //獲取實物的AD采樣數值。
         Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue);    //AD值轉換為重量(g)
         return Weight_Shiwu; 
        }
        unsigned long HX711_Read(void) //選擇芯片工作方式并進行數據讀取
        {
         unsigned long count;   ///儲存輸出值  
         unsigned char i;     
           ////high--高電平 1  low--低電平 0  
         digitalWrite(HX711_DT, HIGH);   ////  digitalWrite作用: DT=1;
         delayMicroseconds(1); ////延時 1微秒  
         digitalWrite(HX711_SCK, LOW);  ////  digitalWrite作用: SCK=0;
         delayMicroseconds(1);   ////延時 1微秒  
         count=0; 
          while(digitalRead(HX711_DT));    //當DT的值為1時,開始ad轉換
          for(i=0;i<24;i++)   ///24個脈沖,對應讀取24位數值
         { 
           digitalWrite(HX711_SCK, HIGH);  ////  digitalWrite作用: SCK=0;
                                        /// 利用 SCK從0--1 ,發送一次脈沖,讀取數值
          delayMicroseconds(1);  ////延時 1微秒  
          count=count<<1;    ///用于移位存儲24位二進制數值
          digitalWrite(HX711_SCK, LOW);   //// digitalWrite作用: SCK=0;為下次脈沖做準備
         delayMicroseconds(1);
           if(digitalRead(HX711_DT))    ///若DT值為1,對應count輸出值也為1
           count++; 
         } 
          digitalWrite(HX711_SCK, HIGH);    ///再來一次上升沿 選擇工作方式  128增益
         count ^= 0x800000;   //按位異或  不同則為1   0^0=0; 1^0=1;
        ///對應二進制  1000 0000 0000 0000 0000 0000  作用為將最高位取反,其他位保留原值
         delayMicroseconds(1);
         digitalWrite(HX711_SCK, LOW);      /// SCK=0;     
         delayMicroseconds(1);  ////延時 1微秒  
         return(count);     ///返回傳感器讀取值
        }


        //設備登錄
        //{"M":"checkin","ID":"xx1","K":"xx2"}\n
        void checkIn() {
          Serial.print("{\"M\":\"checkin\",\"ID\":\"");
          Serial.print(DEVICEID);
          Serial.print("\",\"K\":\"");
          Serial.print(APIKEY);
          Serial.print("\"}\r\n");
        }
        //處理網絡接收到到指令,執行相關動作
        void processMessage(aJsonObject *msg) {
          aJsonObject* method = aJson.getObjectItem(msg, "M");
          if (!method) {
            return;
          }
          String M = method->valuestring;
          if (M == "WELCOME TO BIGIOT") {
            checkOut();
            checkoutTime = millis();
            return;
          }
          if (M == "connected") {
            checkIn();
          }
          if (M == "say") {
            aJsonObject* content = aJson.getObjectItem(msg, "C");
            aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
            String C = content->valuestring;
            String F_C_ID = client_id->valuestring;
            if (C == "play") {
                  digitalWrite(LED, HIGH);
                  delay(500);
                  digitalWrite(LED, LOW);
                  delay(500);
                  digitalWrite(LED, HIGH);
                  delay(500);
                  digitalWrite(LED, LOW);
                  say(F_C_ID, "lock on!");
            }
            if (C == "stop") {
              digitalWrite(lock, HIGH);
              delay(500); 
              digitalWrite(lock, LOW); 
              say(F_C_ID, "lock off!");
            }
            if (C == "new") {
              say(F_C_ID, "new finger");
              getFingerprintEnroll();
            }
            if (C == "open") {
              say(F_C_ID, "finger test ");
              FingerprintIdentification();   
            }
            if (sta == 1) {
              say(F_C_ID, "未知者嘗試開啟!");
          }
            if (sta == 3) {
              say(F_C_ID, "有你的快遞!");
          }
            if (sta == 2) {
              say(F_C_ID, "鎖已開啟!");
          }
        }
        }//

        //發送say指令,用于設備與用戶、設備與設備間通訊
        //{"M":"say","ID":"xx1","C":"xx2","SIGN":"xx3"}\n
        void say(String ID, String c) {
          Serial.print("{\"M\":\"say\",\"ID\":\"");
          Serial.print(ID);
          Serial.print("\",\"C\":\"");
          Serial.print(c);
          Serial.print("\"}\r\n");
        }
        //強制設備下線,用消除設備掉線延時
        void checkOut() {
          Serial.print("{\"M\":\"checkout\",\"ID\":\"");
          Serial.print(DEVICEID);
          Serial.print("\",\"K\":\"");
          Serial.print(APIKEY);
          Serial.print("\"}\n");
        }
        //查詢設備在線狀態
        //{"M":"status"}\n
        void checkStatus() {
          Serial.print("{\"M\":\"status\"}\n");
          lastCheckStatusTime = millis();
        }


        uint8_t readnumber(void) {
          uint8_t num = 0;
          
          while (num == 0) {
            while (! Serial.available());
            num = Serial.parseInt();
          }
          return num;
        }

        uint8_t getFingerprintEnroll() { //指紋注冊
          Serial.println("準備注冊指紋!");
          int id =1;
          Serial.print("登記ID #");
          Serial.println(id);
          int p = -1;
          Serial.print("等待有效的指紋注冊為 #"); Serial.println(id);
          while (p != FINGERPRINT_OK) {
            p = finger.getImage();
            switch (p) {
            case FINGERPRINT_OK:
              Serial.println("采集指紋");
              break;
            case FINGERPRINT_NOFINGER:
              Serial.println(".");
              break;
            default:
              Serial.println("未知的錯誤");
              break;
            }
          }

          // OK success!

          p = finger.image2Tz(1);
          switch (p) {
            case FINGERPRINT_OK:
              Serial.println("圖像修改");
              break;
            default:
              Serial.println("未知的錯誤");
              return p;
          }
          
          Serial.println("請移動手指");
          delay(2000);
          p = 0;
          while (p != FINGERPRINT_NOFINGER) {
            p = finger.getImage();
          }
          Serial.print("ID "); Serial.println(id);
          p = -1;
          Serial.println("再次放置手指");
          while (p != FINGERPRINT_OK) {
            p = finger.getImage();
            switch (p) {
            case FINGERPRINT_OK:
              Serial.println("圖像已采集");
              break;
            case FINGERPRINT_NOFINGER:
              Serial.print(".");
            default:
              Serial.println("未知的錯誤");
              break;
            }
          }

        //第二次對比
          p = finger.image2Tz(2);
          switch (p) {
            case FINGERPRINT_OK:
              Serial.println("正在記錄");
              break;
            default:
              Serial.println("未知的錯誤");
              return p;
          }
          
          // 創建成功
          Serial.print("創建指紋為 #");  Serial.println(id);
          
          p = finger.createModel();
          if (p == FINGERPRINT_OK) {
            Serial.println("匹配!");
            id++;
            digitalWrite(LED, HIGH);
            delay(500);
            digitalWrite(LED, LOW);
            delay(500);
            digitalWrite(LED, HIGH);
            delay(500);
            digitalWrite(LED, LOW);
            


            
          } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
            Serial.println("連接錯誤");
            return p;
          } else if (p == FINGERPRINT_ENROLLMISMATCH) {
            Serial.println("指紋不匹配");
            digitalWrite(LED, LOW);
            return p;
          } else {
            Serial.println("未知的錯誤");
            return p;
          }   
          
          Serial.print("ID "); Serial.println(id);
          p = finger.storeModel(id);
          if (p == FINGERPRINT_OK) {
            Serial.println("已儲存!");
          } else {
            Serial.println("未知的錯誤");
            return p;
          }   

        }


        uint8_t FingerprintIdentification()
        {
          int p = -1;
          p=0;
          delay(2000);
          Serial.print("開始指紋測試:");
          p = finger.getImage();
          if (p == FINGERPRINT_OK) {
            Serial.print("開始指紋測試:");
            delay(2000);
            if (p != FINGERPRINT_OK)  return -1;
            delay(2000);
            p = finger.image2Tz();
            if (p != FINGERPRINT_OK)  return -1;
            delay(2000);
            p = 0;
            p = finger.fingerFastSearch();
            if (p != FINGERPRINT_OK)   Serial.print("沒有找到指紋");
            delay(2000);                         //驗證指紋
            if(finger.confidence>80){
              digitalWrite(LED, HIGH); 
              Serial.print("找到指紋ID為 #"); Serial.print(finger.fingerID);
              Serial.print("信心值: "); Serial.println(finger.confidence);
              sta=2;
              
              digitalWrite(lock, HIGH);
              delay(500); 
             // digitalWrite(lock, LOW);        
              digitalWrite(LED, HIGH);
              delay(500);
              digitalWrite(LED, LOW);
              delay(500);
              digitalWrite(LED, HIGH);
              delay(500);
              digitalWrite(LED, LOW);}
            else{
              Serial.print("指紋不匹配");
              sta=1;
              return p;
            }
          }
        }


        評論:共0條

        返回頂部

        <em id="ri2my"></em>
      2. <em id="ri2my"></em>
        <em id="ri2my"><label id="ri2my"><nav id="ri2my"></nav></label></em>
      3. <em id="ri2my"><label id="ri2my"></label></em>
        <div id="ri2my"></div>
        1. <em id="ri2my"><label id="ri2my"></label></em>
        2. <em id="ri2my"><ol id="ri2my"></ol></em>
          <em id="ri2my"></em>

          1. 免费高清视频