作者:往兮321 | 更新時間:2020-05-12 | 瀏覽量:649
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;
}
}
}