بۇ يازمىنى ئاخىرىدا e-chewendaz تەھرىرلىگەن. ۋاقتى 2016-11-4 11:30
ئەسسالامۇ ئەلەيكۇم ئالىپ تورىدىكى بارلىق ئېلېكترون،Arduino ھەۋەسكارلىرى! ھەممىڭلارغا "ئىدراك ئەترىتى"دىكى ئېلېكتر چەۋەندازدىن ئوتلۇق سالام!
تۈرلۈك سەۋەبلەر تۈپەيلى ئالىپقا تېما يوللىمىغىلىمۇ خىلى كۈنلەر بوپتۇ،بۈگۈن تورداشلارنىڭ ھوزۇرىغا بۇ تېمىنى سۇندۇم.
يانفۇن ئارقىلىق ماشىنا ئىشكىنى ئېچىش،ئوت ئالدۇرۇش ئاللىبۇرۇن رىئاللىققا ئايلىنىپ بولغان تېخنىكا بولۇپ،بىراق ئورنىتىش تەننەرىخى سەل يۇقىرى بولغاچقا ھەممە ئادەم ئۇنى سېتىۋىلىپ ئورناتمايدۇ ئەلۋەتتە،ئارىمىزدىكى بەزى ئاردىينو ھەۋەسكارلىرى ئىلگىرى توكسىكلىت،موتوسىيكىلىتلارنى ئاردىينونىڭ ياردىمىدە يانفۇن ئارقىلىق (كۆكچېش ئارقىلىق) قۇلۇپلاش،ئېچىشنى ئىشقا ئاشۇرغان بولسىمۇ،ماشىنا ئىشكىنى يانفۇن ئارقىلىق ئېچىش توغرىسىدا ئىزدىنىپ باققانلار يوق دىيەرلىك،مەن توردىن ماتىرىيال كۆرۈش داۋامىدا بۇ مەسلىنى ئۆزگە خاس ئۇسۇلدا ھەل قىلغان بىر تېمىنى كۆرگەنىدىم،شۇنى كۆپچىلىك بىلەن ئورتاقلىشاي دەپ بۇ تېمىنى يوللىشىم.
سەمىمىي ئەسكەرتىش: بۇنى مەنمۇ سىناپ باقمىدىم،شۇڭا سىناپ مەسىلە كۆرۈلسە مەن ۋە ئىدراك ئەتىرىتى مەسئۇل ئەمەس،مەن بۇ يەردە پەقەت مەسىلە ھەل قىلىشنىڭ ھەرخىل يولى بارلىقىدىن ئىبارەت بىر قائىدىنى چۈشەندۈرۈپ ئۆتمەكچى ھەمدە قېرىنداشلارنىڭ ئىجادىيىتىگە ئىلھام بەرمەكچى خالاس.
تېمىنىڭ ئەسلى ئادرىسى
بۇ قۇرۇلمىدا ماشىنىنىڭ مۇناسېۋەتلىك قاتتىق دىتاللىرىغا ھىچقانداق ئۆزگەرتىش كىرگۈزمىگەن،پەقەت ماشىنىنىڭ تىزگىنىكىنى ئاردىينو تاختىسىغا ئۇلاپ،يانفۇندىكى ئەپ دىتالى ئارقىلىق يىراقتىن كونتىرول قىلىشىنى ئىشق ئاشۇرغان،سىمسىز ئالاقىگە كۆك چېش مودىلىنى ئىشلەتكەن.
قۇرۇلمىغا ئائىت فىلىم:
تەجرىبىگە كىتەرلىك دىتاللار: نانو ياكى مىكرو تىپلىق ئاردىينو تاختىسى بىر دانە،كۆكچېش مودىلى،لىيتىي باتارىيەدىن بىر دانە،ماشىنىڭىزنىڭ زاپاس تىزگىنىكى بولسا بىر دانە،ئاندىن بىر دانە سۇلىيا قۇتا،يىتەرلىك ئۇلاش سىمى.
مۇناسېۋەتلىك توك يول قىسىملىرىنى بەك تەپسىلى تونۇشتۇرۇپ ئۆتمەي،توك يول ئاساسىي بارلار،ماشىنىسى بارلار،سىناپ باققۇسى بارلار ئەسلى تېمىدىن كۆرۈپ باقسا بولىدۇ،تۆۋەندە مۇناسېۋەتلىك رەسىملەر كۆرسىتىلدى.
قۇرۇلمىنىڭ پۈتكەندىكى ھالىتى:
بۇقۇرۇلمىدا ئىشلەتكەن ماشىنا تىزگىنىكى:
قۇرۇلمىدا ئىشلەتكەن باتارىيە:
قۇرۇلمىنىڭ ئۈز-چات قىسمى:
بۇ قۇرۇلمىنى ياساپ بىقىپ،يارىمىسا ياكى مۇۋاپىقىيەتلىك بولمىسا ماشىنىڭىزنىڭ تىزگىنىكىنى ئەسلىگە كەلتۈرۋاسلىڭىزمۇ بولىدۇ.ئەسلىي تېمىدىكى كۆكچېش مودىلىغا توك مەنبەسىز مودىل ئىشلەتكەن بولغاچقا ئايرىم توك تەمىنلەش بۆلىكى قېتىلغان،ئاردىينو تاختىغا ئاردىينو مىكرونى ئىشلەتكەچكە ئايرىم پروگرامما چۈشۈرۈش بۆلىكىنى ئىشلەتكەن،شۇڭا كۆپچىلىكىنىڭ قايمۇقۇپ قالماسلىقىنى ئەسكەرتىمىز.
يانفۇن ئەپ دىتالىنىڭ كۆرۈنمە يۈزى:
مۇناسېۋەتلىك دىتاللار بەيدۇ تور دىسكىسىدا ساقلانغان بولغاچقا بۇ يەردە تەمىنلەشكە ئامالسىز بولۇپ قالدىم.ئەپ دىتالنى ئارىمىزدىكى پروگراممىرلارغا ياساتساق بولىدۇ.
توك يولنىڭ تۈزلۈش سىخىمىسى:
ئاردىينو پروگراممىسى تۆۋەندىكىچە:
- #include
- #include
- #define HWRSTPIN 7
- #define LOCKPIN 4
- #define UNLOCKPIN 5
- #define DEFAULTPIN 6
- #define DETECTPIN 2
- #define MCULED 13
- struct CellObject {
- char mac0[13];
- char mac1[13];
- char mac2[13];
- char pin[7];
- };
- 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[13];
- 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[idx++] = 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[i + 1]) {
- mc1 = false;
- break;
- }
- }
- for (int i = 0; i < 12; i++) {
- if (cob.mac2 != str[i + 1]) {
- 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[i + 1]);
- }
- Serial.println();
- back = false;
- }
- }
- if ((inChar == '#') || (inChar == '}')
- || (inChar == ']') || (inChar == ';')) {
- stringComplete = true;
- }
- }
- }
مەزمۇننى كۆچۈرۈۋېلىش
بۇ پروگرامما قىسىمى بىر قانچە خىل ئىقتىدارنى ئۆز ئىچىگە ئالغان بولغاچقا بىر قەدەر مۇرەككەپ،قىزىققۇچىلار بولسا مۇشۇ تېما ئاستىدا مۇزاكىرە قىلساق بولىدۇ،بۇ تېما پەقەت مەسىلە ھەل قىلىشنىڭ ھەر خىل يولى بارلىقىنى ئىسپاتلاش يۈزىسىدىن يوللاندى.
كامالى ئىھتىرام بىلەن:
ئىدراك ئەتىرىتى
Idrak team
易达科团队
ئېلېكتېر چەۋەنداز
2016-يىلى 11-ئاينىڭ 4-كۈنى |