簡體   English   中英

Arduino Servo 在 setup function 中工作但不使用藍牙命令

[英]Arduino Servo working in setup function but not with bluetooth command

我遇到了一個非常奇怪的問題,我為 arduino UNO 3 編寫了代碼,該代碼旨在使用伺服電機解鎖門,附帶的組件如下

  1. 伺服馬達
  2. 1 個紅色 LED(用於故障警報)
  3. 1 個綠色 LED(用於成功提醒)
  4. 1 個蜂鳴器(解鎖時發出聲音警報)

代碼如下

#include <Arduino_JSON.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>
#include <Servo.h>

String com = "";

const int buzzer    = 6;
const int ledfalse  = 8;
const int ledtrue   = 13;
const int servo     = 11;

Servo myservo;
SoftwareSerial mySerial(2, 3);

void ResetAdmin()
{
    for (int i = 0 ; i < EEPROM.length() ; i++)
            EEPROM.write(i, 0);

    Blink(ledtrue, 2);
}

void WriteAdmin(String admin)
{
    byte len = admin.length();
    EEPROM.write(0, len);
    for (int i = 0; i < len; i++)
    {
        EEPROM.write(i + 1, admin[i]);
    }
    
    Blink(ledtrue, 2);
}

String ReadAdmin()
{
    int newStrLen = EEPROM.read(0);
    char data[newStrLen + 1];
    for (int i = 0; i < newStrLen; i++)
    {
        data[i] = EEPROM.read(i + 1);
    }
    
    data[newStrLen] = '\0';
    return String(data);
}

void Unlock()
{
    Alert();
    myservo.write(0);
    delay(500);
    myservo.write(90);
    delay(6500);
    myservo.write(360);
    delay(500);
    myservo.write(90);
}

void Blink(int type, int times)
{
      for(int i = 1; i <= times; i++)
      {
            digitalWrite(type, HIGH);
            delay(80);
            digitalWrite(type, LOW);
            delay(80);
      }
}

void Alert()
{
      for(int i = 1; i <= 4; i++)
      {
            tone(buzzer, 1000);
            delay(80);
            noTone(buzzer);
            delay(80);
      }
}

void ProcessCommand(String command)
{
      if(command == "unlock")
            Unlock(); //not works here
      else if(command == "reset")
            ResetAdmin();
      else
      {
            Blink(ledfalse, 2);
      }
}

void setup() 
{ 
    myservo.attach(servo);
    mySerial.begin(9600);

    pinMode(buzzer, OUTPUT);
      pinMode(ledfalse, OUTPUT);
      pinMode(ledtrue, OUTPUT);
     //Unlock() or Blink(ledtrue, 4) or Alert() works here    

    digitalWrite(ledtrue, HIGH);
    digitalWrite(ledfalse, HIGH);
    delay(3000);
    digitalWrite(ledtrue, LOW);
    digitalWrite(ledfalse, LOW);
}

void loop()
{
    while(mySerial.available() > 0)
      {
            delay(10);
            com += (char)Serial.read();
      }
    
      if(com.length() > 0)
      {
            JSONVar doc = JSON.parse(com);

            if (JSON.typeof(doc) != "undefined") 
            {
                  String admin = ReadAdmin();
                  if(admin == "")
                  {
                        admin = doc["admin"];
                        WriteAdmin(admin);
                  }
            
                  if(admin == doc["admin"])
                  {
                        ProcessCommand((const char*) doc["command"]);
                  }
                  else
                  {
                        Blink(ledfalse, 2);
                  }
            }
            else
            {
                  Blink(ledfalse, 2);
            }
        
            com = "";
      }
    
      delay(10);
}

發送命令的 java 片段如下

private void Unlock() {
        if (btSocket != null) {
            try {
                String payload = "{\"admin\": \"" + getUUID() + "\", \"command\": \"unlock\"}";
                btSocket.getOutputStream().write(payload.getBytes());
            } catch (Exception e) {
                e.printStackTrace();
                biometricLoginButton.setImageResource(R.drawable.warning);
                failed = true;
                Toast.makeText(getBaseContext(), "Error occurred while unlocking", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getBaseContext(), "Door Lock not connected", Toast.LENGTH_SHORT).show();
            biometricLoginButton.setImageResource(R.drawable.warning);
            failed = true;
        }
    }

問題是當我將Alert()Unlock()Blink() function 放入 Arduino 設置 function 時,警報工作正常,其他兩個也是如此,但是當使用藍牙信號調用相同的函數時,它們都不起作用。 請注意,function 被稱為伺服嘗試移動但不正確,這表明藍牙正在從 android 正確接收數據並且正在正確評估條件。

最后我自己弄清楚了問題,基本上問題出在 Arduino 的 EEPROM 代碼的問題部分如下

String admin = ReadAdmin();
if(admin == "")
{
     //on first run it never returned empty string, may be my reading function bug
     admin = doc["admin"];
     WriteAdmin(admin);
}
            
if(admin == doc["admin"])
{
     //due to garbage value compared with actual one this block never executed
     rocessCommand((const char*) doc["command"]);
}
else
{
     Blink(ledfalse, 2);
}

第一個條件是第一次運行,這樣當 EEPROM 中沒有存儲管理員時,然后存儲 JSON 中的管理員,但我不知道為什么,但它總是一些垃圾值而不是空或 null 字符串,這就是為什么管理員不匹配,例如垃圾值和 JSON 中收到的值,因此不運行解鎖序列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM