e-chewendaz يوللانغان ۋاقتى 2016-11-4 11:29:03

Arduino-ماشىنا ئىشكىنى يانفۇن ئارقىلىق كونتىرول قىلىش

بۇ يازمىنى ئاخىرىدا   e-chewendaz تەھرىرلىگەن. ۋاقتى2016-11-4 11:30

ئەسسالامۇ ئەلەيكۇم ئالىپ تورىدىكى بارلىق ئېلېكترون،Arduino ھەۋەسكارلىرى! ھەممىڭلارغا"ئىدراك ئەترىتى"دىكى ئېلېكتر چەۋەندازدىن ئوتلۇق سالام!
تۈرلۈك سەۋەبلەر تۈپەيلى ئالىپقا تېما يوللىمىغىلىمۇ خىلى كۈنلەر بوپتۇ،بۈگۈن تورداشلارنىڭ ھوزۇرىغا بۇ تېمىنى سۇندۇم.
يانفۇن ئارقىلىق ماشىنا ئىشكىنى ئېچىش،ئوت ئالدۇرۇش ئاللىبۇرۇن رىئاللىققا ئايلىنىپ بولغان تېخنىكا بولۇپ،بىراق ئورنىتىش تەننەرىخى سەل يۇقىرى بولغاچقا ھەممە ئادەم ئۇنى سېتىۋىلىپ ئورناتمايدۇ ئەلۋەتتە،ئارىمىزدىكى بەزى ئاردىينو ھەۋەسكارلىرى ئىلگىرى توكسىكلىت،موتوسىيكىلىتلارنى ئاردىينونىڭ ياردىمىدە يانفۇن ئارقىلىق (كۆكچېش ئارقىلىق) قۇلۇپلاش،ئېچىشنى ئىشقا ئاشۇرغان بولسىمۇ،ماشىنا ئىشكىنى يانفۇن ئارقىلىق ئېچىش توغرىسىدا ئىزدىنىپ باققانلار يوق دىيەرلىك،مەن توردىن ماتىرىيال كۆرۈش داۋامىدا بۇ مەسلىنى ئۆزگە خاس ئۇسۇلدا ھەل قىلغان بىر تېمىنى كۆرگەنىدىم،شۇنى كۆپچىلىك بىلەن ئورتاقلىشاي دەپ بۇ تېمىنى يوللىشىم.
سەمىمىي ئەسكەرتىش: بۇنى مەنمۇ سىناپ باقمىدىم،شۇڭا سىناپ مەسىلە كۆرۈلسە مەن ۋە ئىدراك ئەتىرىتى مەسئۇل ئەمەس،مەن بۇ يەردە پەقەت مەسىلە ھەل قىلىشنىڭ ھەرخىل يولى بارلىقىدىن ئىبارەت بىر قائىدىنى چۈشەندۈرۈپ ئۆتمەكچى ھەمدە قېرىنداشلارنىڭ ئىجادىيىتىگە ئىلھام بەرمەكچى خالاس.
تېمىنىڭ ئەسلى ئادرىسى
بۇ قۇرۇلمىدا ماشىنىنىڭ مۇناسېۋەتلىك قاتتىق دىتاللىرىغا ھىچقانداق ئۆزگەرتىش كىرگۈزمىگەن،پەقەت ماشىنىنىڭ تىزگىنىكىنى ئاردىينو تاختىسىغا ئۇلاپ،يانفۇندىكى ئەپ دىتالى ئارقىلىق يىراقتىن كونتىرول قىلىشىنى ئىشق ئاشۇرغان،سىمسىز ئالاقىگە كۆك چېش مودىلىنى ئىشلەتكەن.
قۇرۇلمىغا ئائىت فىلىم:
http://v.youku.com/v_show/id_XMTU4NDcwNjg4OA==.html
http://v.youku.com/v_show/id_XMTU4NDcxMTU1Ng==.html
تەجرىبىگە كىتەرلىك دىتاللار: نانو ياكى مىكرو تىپلىق ئاردىينو تاختىسى بىر دانە،كۆكچېش مودىلى،لىيتىي باتارىيەدىن بىر دانە،ماشىنىڭىزنىڭ زاپاس تىزگىنىكى بولسا بىر دانە،ئاندىن بىر دانە سۇلىيا قۇتا،يىتەرلىك ئۇلاش سىمى.

مۇناسېۋەتلىك توك يول قىسىملىرىنى بەك تەپسىلى تونۇشتۇرۇپ ئۆتمەي،توك يول ئاساسىي بارلار،ماشىنىسى بارلار،سىناپ باققۇسى بارلار ئەسلى تېمىدىن كۆرۈپ باقسا بولىدۇ،تۆۋەندە مۇناسېۋەتلىك رەسىملەر كۆرسىتىلدى.
قۇرۇلمىنىڭ پۈتكەندىكى ھالىتى:


بۇقۇرۇلمىدا ئىشلەتكەن ماشىنا تىزگىنىكى:


قۇرۇلمىدا ئىشلەتكەن باتارىيە:

قۇرۇلمىنىڭ ئۈز-چات قىسمى:


بۇ قۇرۇلمىنى ياساپ بىقىپ،يارىمىسا ياكى مۇۋاپىقىيەتلىك بولمىسا ماشىنىڭىزنىڭ تىزگىنىكىنى ئەسلىگە كەلتۈرۋاسلىڭىزمۇ بولىدۇ.ئەسلىي تېمىدىكى كۆكچېش مودىلىغا توك مەنبەسىز مودىل ئىشلەتكەن بولغاچقا ئايرىم توك تەمىنلەش بۆلىكى قېتىلغان،ئاردىينو تاختىغا ئاردىينو مىكرونى ئىشلەتكەچكە ئايرىم پروگرامما چۈشۈرۈش بۆلىكىنى ئىشلەتكەن،شۇڭا كۆپچىلىكىنىڭ قايمۇقۇپ قالماسلىقىنى ئەسكەرتىمىز.
يانفۇن ئەپ دىتالىنىڭ كۆرۈنمە يۈزى:

مۇناسېۋەتلىك دىتاللار بەيدۇ تور دىسكىسىدا ساقلانغان بولغاچقا بۇ يەردە تەمىنلەشكە ئامالسىز بولۇپ قالدىم.ئەپ دىتالنى ئارىمىزدىكى پروگراممىرلارغا ياساتساق بولىدۇ.
توك يولنىڭ تۈزلۈش سىخىمىسى:

ئاردىينو پروگراممىسى تۆۋەندىكىچە:

#include
#include

#define HWRSTPIN 7
#define LOCKPIN 4
#define UNLOCKPIN 5
#define DEFAULTPIN 6
#define DETECTPIN 2
#define MCULED 13

struct CellObject {
char mac0;
char mac1;
char mac2;
char pin;
};

Energy energy;
CellObject cob;
String pin_type = "AT+TYPE0";
String inputString = "";
boolean stringComplete = false;
boolean license = false;
boolean sts = false;
const unsigned long WAIT_TIME1 = 120000;
const unsigned long WAIT_TIME2 = 25000;
const unsigned long WAIT_TIME3 = 200000;
unsigned long connStop = 0;
unsigned long mcuSleep = 0;

CellObject get_Conn() {
CellObject getvaul;
EEPROM.get(0, getvaul);
return getvaul;
}
void set_Conn(CellObject setVar) {
EEPROM.put(0, setVar);
EEPROM.put(512, 1);
}

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

void default_set() {                  //MCU烧录后EEPROM均是清空状态,所以此函数功能是保留至少要能保存设置一个可以连接的MAC,能让手机APP连接后再修改
clrEEPROM();
delay(1000);
CellObject defaultVar = {
    "",                               //发现官方EEPROM库函数有bug,创建对象时第一个属性值读写不全。此处创建结构体类时,第一个属性留空
    "008012345678",
    "EA3146CE9FF7",
    "000000"
};
pin_type = "AT+TYPE0";
set_Conn(defaultVar);
root_bt();
}

void bt_hw_rst() {                         //蓝牙模块连接以后自动切换到透传模式,此时无法接收AT指令
digitalWrite(HWRSTPIN, HIGH);         //所以此处使用切换蓝牙HW_RST PIN状态来强制断开蓝牙连接恢复到AT指令模式
delay(1500);
digitalWrite(HWRSTPIN, LOW);
delay(3500);
wakeup_bt();
sleep_bt();
}

void bt_sf_rst() {
Serial.println("AT+RESET\r");
delay(2500);
}
void sleep_bt() {
Serial.println("AT+SLEEP\r");
delay(1000);
}
void wakeup_bt() {
for (int i = 0; i <= 12; i++) {
    Serial.print("WAKEUPBT");
}
Serial.println("\r");
delay(1500);
}

void root_bt() {   //设置蓝牙模块
while (true) {
    digitalWrite(MCULED, !digitalRead(MCULED));
    if (digitalRead(DETECTPIN) == LOW) {
      delay(30);
      if (digitalRead(DETECTPIN) == LOW) {
          break;
      }
    }
    delay(250);
}
digitalWrite(MCULED, HIGH);
wakeup_bt();
//Serial.println("AT+NAMELIFAN320\r");
//delay(600);
Serial.print(pin_type); Serial.println("\r");
delay(500);
cob = get_Conn();
Serial.print("AT+PIN"); Serial.print(cob.pin); Serial.println("\r");
delay(800);
Serial.println("AT+ROLE0\r");
delay(500);
Serial.println("AT+NOTI1\r");
delay(500);
Serial.println("AT+NOTP1\r");
delay(500);
Serial.println("AT+IMME0\r");
delay(500);
Serial.println("AT+PWRM0\r");
delay(1000);
bt_sf_rst();
digitalWrite(MCULED, LOW);
}

void ctrl_login() {                        //控制MCU是否可以休眠
if (digitalRead(DETECTPIN) == LOW) {
    delay(30);
    if (digitalRead(DETECTPIN) == LOW) {
      delay(30);
      if (digitalRead(DETECTPIN) == LOW) {
      sts = false;
      license = false;
      mcu_sleep();
      }
    }
}
}

void ctrl_timeout() {                           //连接超时控制
unsigned long currentMillis = millis();
if (digitalRead(DETECTPIN) == HIGH) {
    delay(30);
    if (digitalRead(DETECTPIN) == HIGH) {
      delay(30);
      if (digitalRead(DETECTPIN) == HIGH) {
      if ( (license == false) && (currentMillis - connStop >= WAIT_TIME2)) {
          connStop = currentMillis;
          Serial.println("timeout1");
          bt_hw_rst();   
      } else if (license == true && (currentMillis - connStop >= WAIT_TIME1) && stringComplete != true && (!Serial.available())) {
          connStop = currentMillis;
          Serial.println("timeout2");
          bt_hw_rst();
      }
      }
    }
}
}

void mcu_sleep() {                                 //MCU休眠代码
unsigned long currentMillis = millis();
if (currentMillis - mcuSleep >= WAIT_TIME3) {
    mcuSleep = currentMillis;
    Serial.println("mcuslp");
    wakeup_bt();
    sleep_bt();
    energy.PowerDown();
}
}

void base_case() {       //业务主体代码
if (stringComplete) {
    if (digitalRead(DETECTPIN) == HIGH) {
      if (inputString.endsWith("close#") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      digitalWrite(LOCKPIN, HIGH);
      delay(1100);
      digitalWrite(LOCKPIN, LOW);
      Serial.println("off");
      } else if (inputString.endsWith("open#") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      digitalWrite(UNLOCKPIN, HIGH);
      delay(1100);
      digitalWrite(UNLOCKPIN, LOW);
      Serial.println("on");
      } else if (inputString.endsWith(";") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      cob = get_Conn();
      String temp = inputString.substring((inputString.indexOf(';') - 6), inputString.indexOf(';'));
      for (int i = 0; i < temp.length(); i++) {
          cob.pin = temp;
      }
      Serial.println(cob.pin);
      set_Conn(cob);
      root_bt();
      } else if (inputString.endsWith("admin#") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      Serial.print("{\"user1\":\"");Serial.print(cob.mac1);Serial.print("\",\"user2\":\"");                        //返回JSON格式
      Serial.print(cob.mac2);Serial.print("\",\"PIN\":\"");Serial.print(cob.pin);Serial.print("\"}");   
      } else if (inputString.endsWith("}") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      cob = get_Conn();
      String temp = inputString.substring((inputString.indexOf('}') - 12), inputString.indexOf('}'));
      for (int i = 0; i < temp.length(); i++) {
          cob.mac1 = temp;
      }
      Serial.println(cob.mac1);
      set_Conn(cob);
   
      } else if (inputString.endsWith("]") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      cob = get_Conn();
      String temp = inputString.substring((inputString.indexOf(']') - 12), inputString.indexOf(']'));
      for (int i = 0; i < temp.length(); i++) {
          cob.mac2 = temp;
      }
      Serial.println(cob.mac2);
      set_Conn(cob);
         
      } else if (inputString.endsWith("skoff#") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      pin_type = "AT+TYPE0";
      Serial.println(pin_type);
      root_bt();
      } else if (inputString.endsWith("skon#") && license == true) {
      connStop = millis();   //
      mcuSleep = millis();   //
      pin_type = "AT+TYPE3";
      Serial.println(pin_type);
      root_bt();
      } else if (license == false) {
      Serial.println("ghost");
      }
    }
    inputString = "";
    stringComplete = false;
}
delay(50);
}

void wakeISR() {                      //唤醒后执行代码
if (energy.WasSleeping()) {
    digitalWrite(MCULED, HIGH);
    Serial.println("mcuwk");
    connStop = millis();
    mcuSleep = millis();
    delay(1000);
    digitalWrite(MCULED, LOW);
} else {
}
}

void setup() {                   //MCU初始化

digitalWrite(HWRSTPIN, LOW);
digitalWrite(DEFAULTPIN, HIGH);
digitalWrite(LOCKPIN, LOW);
digitalWrite(UNLOCKPIN, LOW);

pinMode(HWRSTPIN, OUTPUT);
pinMode(DEFAULTPIN, OUTPUT);
pinMode(DETECTPIN, INPUT_PULLUP);
pinMode(LOCKPIN, OUTPUT);
pinMode(UNLOCKPIN, OUTPUT);
pinMode(MCULED, OUTPUT);

digitalWrite(HWRSTPIN, LOW);
digitalWrite(DEFAULTPIN, HIGH);
digitalWrite(LOCKPIN, LOW);
digitalWrite(UNLOCKPIN, LOW);
digitalWrite(MCULED, LOW);

Serial.begin(9600);
inputString.reserve(200);
if (digitalRead(DEFAULTPIN) == LOW) {
    delay(20);
    if (digitalRead(DEFAULTPIN) == LOW) {
      default_set();
    }
}
if (EEPROM.read(512) != 1) {
    default_set();
}
attachInterrupt(0, wakeISR, RISING);

}

void loop() {      //主循环代码

base_case();
ctrl_login();
ctrl_timeout();
delay(500);

}

void serialEvent() {    //串口事件响应代码
cob = get_Conn();
char str;
int idx = 0;
boolean mc1 = false;
boolean mc2 = false;
boolean back = true;
while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inputString.indexOf('x') != -1 && idx < 13 && sts == false) {
      str = inChar;
    }
    if (idx >= 13 && sts == false) {
      mc1 = true;
      mc2 = true;
      /*for (int i = 0; i < 12; i++) {      
      Serial.print(cob.mac1);
      Serial.print("-");
      }
      Serial.println();
      for (int i = 0; i < 12; i++) {
      Serial.print(cob.mac2);
      Serial.print("+");
      }
      Serial.println();
      for (int i = 0; i < 6; i++) {
      Serial.print(cob.pin);
      Serial.print("*");
      }*/
      for (int i = 0; i < 12; i++) {
      if (cob.mac1 != str) {
          mc1 = false;
          break;
      }
      }
      for (int i = 0; i < 12; i++) {
      if (cob.mac2 != str) {
          mc2 = false;
          break;
      }
      }
      if (mc1 == true || mc2 == true) {
      license = true;
      sts = true;
      } else if((mc1 == true || mc2 == true)&&(back == true)) {
      Serial.print("login:");
      for (int i = 0; i < 12; i++) {
          Serial.print(str);
      }
      Serial.println();
      back = false;
      }
    }

    if ((inChar == '#') || (inChar == '}')
      || (inChar == ']') || (inChar == ';')) {
      stringComplete = true;
    }
}
}

بۇ پروگرامما قىسىمى بىر قانچە خىل ئىقتىدارنى ئۆز ئىچىگە ئالغان بولغاچقا بىر قەدەر مۇرەككەپ،قىزىققۇچىلار بولسا مۇشۇ تېما ئاستىدا مۇزاكىرە قىلساق بولىدۇ،بۇ تېما پەقەت مەسىلە ھەل قىلىشنىڭ ھەر خىل يولى بارلىقىنى ئىسپاتلاش يۈزىسىدىن يوللاندى.
كامالى ئىھتىرام بىلەن:
ئىدراك ئەتىرىتى
Idrak team
易达科团队
ئېلېكتېر چەۋەنداز
2016-يىلى 11-ئاينىڭ 4-كۈنى

aslima998 يوللانغان ۋاقتى 2016-11-4 15:10:36


بۇقۇرۇلمىنىڭئاندىرويىدكونتىرولقىسمى ئانچە ياخشى لاھىيلەنمەپتۇ . باشقىلارتىلفۇننىڭ mac ئادېرسىنىئۆزگەرتىش ئارقىلىق ماشىنىڭىزنىكونتىرولقىلالايدۇ ،شۇڭابىخەتەرلىكنىمۇئويلىشىشكىرەك ..

seyyahi يوللانغان ۋاقتى 2016-11-4 12:01:11

ماشىنا بىلەن ئېلىكتىرونلۇق ئىشىك توسىقىدىن ئۆتكەن ۋاقتىمىزدا ماشىنا ئىچىدىكى سىگنال ئەسۋابى بىلەن ئىشىك توساقنىڭ سىگنال تارقىتىش قوبۇللاش پىرىنسپى توغرىلىق سۆزلەپ بەرسىڭىز بوپتىكەن.

abduxkuraaaaaaa يوللانغان ۋاقتى 2016-11-4 12:01:15

لىكىن بەكلا قىزىقىمەنمۇشدا ئىشلاغا تېمىڭىزغا رەھمەتhttp://aliptori.com//mobcent//app/data/phiz/default/03.png

salaydin. يوللانغان ۋاقتى 2016-11-4 13:02:01

بۇنىكۆكچىش قىلسائارلىق چەكلىكبوپقالىدۇباشقابىر يولئارقىلىق ئارلىق چەكلىمىسىگە ئۇچۇرمايدىغان قىلغان بولساڭلاشۇنداق قىلساڭلائالىپقا تېمايېزىشنى ئۇنۇتماڭلا

umut吧 يوللانغان ۋاقتى 2016-11-4 13:10:55

مەنمۇ   قىزقىمەنرەھمەت

akbarhann يوللانغان ۋاقتى 2016-11-4 19:43:46

aslima998 يوللىغان ۋاقتى2016-11-4 15:10
بۇقۇرۇلمىنىڭئاندىرويىدكونتىرولقىسمى ئانچە ياخش ...

Mac ئادرېسىنى قانداق ئۆزگەرتىدۇ يانفوننىڭ.

ئالپ520 يوللانغان ۋاقتى 2016-11-4 19:56:29

مەن ماشىنا ئىشكىنىيانفۇن سىگنالى بىلەن تىگىنەكنى بىرلەشتۈربپ ئاچقىلى بۇلدۇ دەپ ئاڭلىغان تىم بۇ راسمۇ

xukur218 يوللانغان ۋاقتى 2016-11-4 20:05:02


http://aliptori.com/data/appbyme/upload/image/201611/04/0Yv0Bp3Sii5C.jpg

aslima998 يوللانغان ۋاقتى 2016-11-4 21:16:55

akbarhann يوللىغان ۋاقتى2016-11-4 19:43
Mac ئادرېسىنى قانداق ئۆزگەرتىدۇ يانفوننىڭ.

بەيدۇدائۇنداقدىتاللاركۆپ ، روتئەپبولغانبولسىڭىزئۆزگەرتىش تەس ئەمەس .

bulbulla يوللانغان ۋاقتى 2016-11-4 21:51:22

بۇ يازمىنى ئاخىرىدا   bulbulla تەھرىرلىگەن. ۋاقتى2016-11-4 22:24

aslima998 يوللىغان ۋاقتى2016-11-4 15:10
بۇقۇرۇلمىنىڭئاندىرويىدكونتىرولقىسمى ئانچە ياخش ...

مىنىڭچەبىخەتەرلىكى ئەسلىدىكى تىزگىنەكتىن جىق پەرىقلەنمەسلىكى مۇمكىن ……
چۈنكى ماك ئادرىسىنى ئۆزگەرتسە ئاردۈينوغا پىروگراممىنى قايتىدىن يېزىشقا توغرا كىلىدۇ،بولمىسا ئاردۈينو شەرتنى يالغاندەپ پىروگراممىنى ئىجرا قىلمايدۇ.ئۇنىڭ ئۈستىگە بۇخىلدىكى ئەپنى باشقا يانفۇنغا كۈچۈرۋېلىپ ،ئەپنى تەتۈرسىگە يەشكەن ھالەتتىمۇ ماك نۇمۇرىنى تاپالمايدۇ ،بۇئەپتە بىخەتەرلىكنى كۆزدە تۇتۇپ ماك ئادرىسىنى ئەپكە بىۋاستە يېزىۋەتمەستىن ئىشلەتكۈچى كىيىن ئۆزى خالاپ كىرگۈزگىلى بولىدىغان قىلىپ لاھىيلەپتۇ.
قالغىنىنى تەپسىلىي ئوتتۇرغا قۇيسىڭىزبىلىپ باقساقبۇلىدۇ.

merdan يوللانغان ۋاقتى 2016-11-5 12:53:51

ئالپ520 يوللىغان ۋاقتى2016-11-4 19:56
مەن ماشىنا ئىشكىنىيانفۇن سىگنالى بىلەن تىگىنەكنى بىر ...

بۇ يالغان گەپ...مەن سىناپ باققان

13040480202 يوللانغان ۋاقتى 2016-11-5 15:03:53

رەمەنمۇ   قىزقىمەنرەھمەت

abdulla0000 يوللانغان ۋاقتى 2016-11-5 15:46:44

مىنىڭ ئاكاممۇ بۇرۇن موتسىكىلىتىنى مۇشۇنداقىلىپ كونتىرول قىلىپ يۇرتىلىكىن مەن بۇنىڭ بۇنچىۋالا تەس لىكىن بلمەيدىكەنمەن :Q:funk:

سەنسىز1 يوللانغان ۋاقتى 2016-11-6 22:44:40

مۇشۇندا نىمىگە بەك قىزىقىمەن ياساپ بىرىدىغانلا بولسا سىتۋالاتتم،18609984526
بەت: [1]
: Arduino-ماشىنا ئىشكىنى يانفۇن ئارقىلىق كونتىرول قىلىش