ระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ)

เริ่มที่ไซต์นี้ ลิงค์.
ตัวเลือกที่สะดวกที่สุดในการดึงข้อมูลเกี่ยวกับการเปิดสตาร์ทเตอร์กลายเป็นตัวเลือกสำหรับออปโตคัปเปลอร์ PC817 แผนภาพวงจรระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ)กระดานประกอบด้วยวงจรที่เหมือนกันสามวงจร ทุกอย่างวางอยู่ในกล่องพลาสติก ABS ขนาด 100x100 มม. ภาพถ่ายของออปโตคัปเปลอร์ระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ) เมื่อเชื่อมต่อกับอุปกรณ์สตาร์ทที่มีวาล์วเซมิคอนดักเตอร์ กระแสรั่วไหลจะเพียงพอที่จะเปิด PC817 และเครื่องนับจะทริกเกอร์ผิดพลาด เพื่อยกเว้นสถานการณ์ดังกล่าว มีการเพิ่มอีกหนึ่งอนุกรมเข้ากับวงจรของ LED ออปโตคัปเปลอร์และ LED แสดงการทำงาน เมื่อต้องการทำเช่นนี้ ให้เปิดจัมเปอร์ J1 และ LED LED1 เพิ่มเติมถูกบัดกรีเข้าไป
ส่วนรับจะทำบน ด้าน 1ระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ)ด้าน 2ระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ)บอร์ดพัฒนาเชื่อมต่อกับ ARDUINO MEGA 2560 สำหรับสิ่งนี้ จะใช้ตัวเชื่อมต่อสองแถวที่ส่วนท้าย หน้าจอที่มีความละเอียด 240x400 ซึ่งมีหน้าจอสัมผัสแบบต้านทานและเซ็นเซอร์อุณหภูมิใช้เป็นอุปกรณ์แสดงข้อมูล HX8352B.ระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ) นอกจากนี้ ขั้วต่อไปยัง ICSP บนบอร์ดหน้าจอจะถูกถอดออก และไม่ได้ใช้สล็อต micro SD ความจริงก็คือไม่สามารถใช้ซ็อกเก็ต SD "ดั้งเดิม" ได้เนื่องจากข้อขัดแย้งบนบัส SPI สำหรับแฟลชการ์ด มีการใช้เครื่องอ่านการ์ดแยกต่างหาก ซึ่งรวมถึงโคลง 3,3V และชิปบัฟเฟอร์ที่มีสถานะเอาต์พุตสามสถานะ 74LVS125A นี่คือที่ที่คราดกำลังรอฉันอยู่ บัฟเฟอร์สามสถานะ แต่ E01-ML01DP5 หรือเครื่องอ่านการ์ดใช้งานได้ ในความคิดเห็นของไลบรารี SdFat เห็นคำเตือนเกี่ยวกับความเข้ากันไม่ได้กับอุปกรณ์อื่น ตัวแปลงระดับบน TXS0108E ถูกถอดออกและแทนที่ด้วยจัมเปอร์เพราะว่า E01-ML01DP5 ทนทานต่อสัญญาณ 5V - มันไม่ได้ช่วยอะไร เมื่อใช้ออสซิลโลสโคป ตรวจพบการสูญเสียสัญญาณบนสาย MISO เมื่อเชื่อมต่อเครื่องอ่านการ์ด จากการตรวจสอบอย่างละเอียด พบว่าอินพุตของสัญญาณเปิดใช้งานของ OE 4 แชนเนลของ 74LVS125A นั้นถูกบัดกรีเข้ากับสายทั่วไปและไม่มีการพูดถึงสถานะที่สามใดๆ ชิปบัฟเฟอร์ถูกใช้เป็นตัวแปลงระดับดั้งเดิมจาก 5V เป็น 3.3V โดยใช้ตัวต้านทาน 3,3 KΩ เชื่อมต่อแบบอนุกรมกับสายสัญญาณ ยกเว้นสาย MISO สวิตช์เอาต์พุตด้านล่างอาจดึงดูดสัญญาณไปที่ระดับพื้นดิน เมื่อพิจารณาแล้วว่าสัญญาณเปิดใช้งานของสาย MISO คือพิน 13 จึงถูกดึงออกจากแทร็กและบัดกรีระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ)ระหว่างอุปกรณ์ 9LVS74A CS เลือกพินอินพุต (125) และตัวต้านทานการสิ้นสุด ตอนนี้หากไม่มีการเข้าถึงการ์ดหน่วยความจำ บัฟเฟอร์ MISO จะถูกปิดใช้งานและไม่รบกวนการทำงานของอุปกรณ์อื่นแผนภาพบอร์ดพัฒนาระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ)ตัวรับในการดำเนินงานระบบเก็บข้อมูลอัตโนมัติในพื้นที่ (ต่อ)DS3231 ใช้ซอฟต์แวร์ I2C บัส (TWI) ในการเชื่อมต่อนาฬิกา
โปรแกรม Arduino IDE// สำคัญ: ห้องสมุด Adafruit_TFTLCD จะต้องเป็นพิเศษ
// กำหนดค่าไว้สำหรับทั้ง TFT SHIELD หรือ BREAKOUT BOARD
// ดูความคิดเห็นที่เกี่ยวข้องใน Adafruit_TFTLCD.h สำหรับการตั้งค่า
//โดยทีม Open-Smart และทีม Catalex
//[ป้องกันอีเมล]
//เก็บ: ดีเอ็กซ์.คอม
// open-smart.aliexpress.com/store/1199788
//ฟังก์ชั่นสาธิต: แสดงกราฟิก, ตัวอักษร
// Arduino IDE: 1.6.5
// บอร์ด: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// บอร์ด: OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2นิ้วTFT:
// www.aliexpress.com/store/product/3-2-TFT-LCD-Display-module-Touch-Screen-Shield-board-onboard-temperature-sensor-w-Touch-Pen/1199788_32755473754.html?spm=2114.12010615.0.0.bXDdc3
//เปิดสมาร์ท UNO R3 5V / 3.3V:
// www.aliexpress.com/store/product/OPEN-SMART-5V-3-3V-Compatible-UNO-R3-CH340G-ATMEGA328P-Development-Board-with-USB-Cable-for/1199788_32758607490.html?spm=2114.12010615.0.0.ckMTaN

#รวม // ไลบรารีกราฟิกหลัก
//#รวม // ไลบรารี่เฉพาะฮาร์ดแวร์
#รวม
MCUFRIEND_kbv tft;
#include "SdFat.h" // ใช้ไลบรารี SdFat
SDFat SD;
ไฟล์ SDFile;
ไฟล์ myFile;
#กำหนด SS_CS_PIN

#รวม // เชื่อมต่อไลบรารีเพื่อทำงานกับบัส SPI
#รวม // เชื่อมต่อไฟล์การตั้งค่าจากไลบรารี RF24
#รวม // เชื่อมต่อไลบรารีเพื่อทำงานกับ nRF24L24+
วิทยุ RF24 (47, 49);

#รวม

DS3231 rtc (27, 25);
เวลา เสื้อ;

uint16_t r = 6000;
uint32_t k = 0;

ข้อมูลขนาดยาวที่ไม่ได้ลงนามที่ผันผวน
ลอย leb_1;
ลอย leb_2;
ลอย leb_3;
ลอย leb_4;

ท่อ uint8_t;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ ****************/ /
// หากคุณใช้บอร์ดฝ่าวงล้อม OPEN-SMART TFT //
// แนะนำเพิ่มวงจรแปลงระดับ 5V-3.3V ครับ
// แน่นอนคุณสามารถใช้รุ่น OPEN-SMART UNO Black พร้อมสวิตช์ไฟ 5V/3.3V
// คุณเพียงแค่ต้องเปลี่ยนเป็น 3.3V
// หมุดควบคุมสำหรับ LCD สามารถกำหนดให้กับดิจิทัลหรือ
// หมุดแอนะล็อก...แต่เราจะใช้พินแอนะล็อกเพราะจะทำให้เราทำได้
//—————————————-|
// การฝ่าวงล้อม TFT - Arduino UNO / Mega2560 / OPEN-SMART UNO สีดำ
// GND - GND
// 3V3 - 3.3V
//CS - A3
// อาร์เอส - A2
// WR - A1
// ถ - A0
// RST - รีเซ็ต
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// กำหนดชื่อที่มนุษย์สามารถอ่านได้ให้กับค่าสี 16 บิตทั่วไป:
#กำหนด BLACK 0x0000
#define สีฟ้า 0x001F
#define RED 0xF800
#กำหนดสีเขียว 0x07E0
#กำหนด CYAN 0x07FF
#กำหนด MAGENTA 0xF81F
#define สีเหลือง 0xFFE0
#กำหนดสีขาว 0xFFFF
#กำหนดสีเทา 0x8C51
#กำหนด GREYD 0x39E7

// Adafruit_TFTLCD tft (LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// หากใช้โล่ บรรทัดควบคุมและบรรทัดข้อมูลทั้งหมดจะได้รับการแก้ไข และ
// สามารถเลือกใช้การประกาศที่ง่ายกว่าได้:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

สตริงข้อมูลสตริง;
//String numfileMonth = "1.txt";
ถ่าน perv [] = {"2.txt"};
//String *numfileMonth="1.txt" (ขนาดของ (numfileMonth));
////////////////////////////////////////////////// /////////////////

การตั้งค่าเป็นโมฆะ (โมฆะ) {

rtc.begin();

// หากต้องการตั้งเวลา ให้ยกเลิกการใส่เครื่องหมายบรรทัดที่จำเป็น
// rtc.setDOW(6); // วันของสัปดาห์
// rtc.setTime(22, 04, 0); // เวลา ในรูปแบบ 24 ชั่วโมง
// rtc.setDate(4, 5, 2019); // วันที่ 29 ตุลาคม 2018

Serial.begin (2000000);
///////// การเริ่มต้นหน้าจอ
tft.begin(0x65);
tft.รีเซ็ต();
tft.setRotation(0);
tft.cp437(จริง);
////////////////// ผลลัพธ์ของชื่อ อุปกรณ์ อุปกรณ์ ชื่อองค์กร
tft.fillScreen(สีดำ);
tft.setTextColor(สีขาว);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("ผู้พัฒนา & สร้าง");
tft.setCursor(30, 20);
tft.print (utf8rus("ตัวสร้าง V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("เทิร์นเนอร์ II." ));
ล่าช้า (2000);

radio.begin(); // เริ่มต้นงาน nRF24L01+
radio.setChannel(120); // ระบุช่องรับข้อมูล (ตั้งแต่ 0 ถึง 127)
radio.setDataRate(RF24_250KBPS); // ระบุอัตราการถ่ายโอนข้อมูล (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // ระบุกำลังส่ง (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // เปิด 1 ไพพ์พร้อมตัวระบุของตัวส่งสัญญาณ 1 ตัว 0xAABBCCDD11 เพื่อรับข้อมูล
// เปิดไปป์ 2 ด้วยรหัสตัวส่งสัญญาณ 2xAABBCCDD0 เพื่อรับข้อมูล
radio.startListening(); // เปิดเครื่องรับเริ่มฟังไปป์ที่เปิด
// radio.stopListening();
///////// ผลลัพธ์ของข้อมูลการบริการ
tft.fillScreen(สีดำ);
tft.setCursor(8, 0);
tft.setTextSize(1);
/////////เริ่มการเริ่มต้นการ์ด SD
Serial.println("การ์ด SD เริ่มต้น");
tft.println("การ์ด SD เริ่มต้น");
tft.setCursor(8, 10);
///////// กำลังเริ่มต้นการ์ด
ถ้า (!SD.begin(SD_CS_PIN)) {
Serial.println("เริ่มต้นล้มเหลว!");
tft.fillRect(8, 10, 85, 7, สีแดง);
tft.setTextColor(สีดำ);
tft.println("การเริ่มต้นล้มเหลว!");
กลับ;
}
tft.setTextColor(สีขาว);
Serial.println("การเริ่มต้นเสร็จสิ้น");
tft.println("การกำหนดค่าเริ่มต้นเสร็จสิ้น");
ล่าช้า (2000);
///////// อ่านเวลาและวันที่และกำหนดให้กับตัวแปร
t = rtc.getTime();
time_sec_prev = t.วินาที;
time_day_prev = t.date;
/////////บังคับส่งออกวันที่เพื่อไม่ให้รอวันที่เปลี่ยนเพื่อแสดง
tft.setCursor(180, 0); // กำหนดตำแหน่งเคอร์เซอร์
tft.fillRect(178, 0, 65, 7, สีเทา); // การล้างพื้นที่เอาต์พุตเวลา
tft.setTextSize(1);
tft.print(rtc.getDateStr());
///////// ส่งออกชื่อของวัตถุควบคุม
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("กว้าน I"));
///////// การสร้างไฟล์บันทึกและส่งออกผลลัพธ์ของความพยายามสร้าง
tft.setTextSize(1);
tft.setCursor(130, 10); // หากสร้างไฟล์บันทึก 2.txt การเขียนลงในไฟล์จะดำเนินต่อไป
ถ้า (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open (perv, FILE_WRITE); // หากไม่มีไฟล์ 2.txt ไฟล์นั้นจะถูกสร้างขึ้น
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

ห่วงเป็นโมฆะ (โมฆะ) {
///////// ตรวจสอบการมีอยู่ของคำขอเพื่อส่งออกบันทึกไปยังมอนิเตอร์พอร์ต COM
ถ้า (Serial.available() > 0) {
ถ้า (1 == Serial.read());
///////// และหากยอมรับ "1" แสดงว่าเอาต์พุต
ไฟล์ myFile = SD.open(perv);
// หากมีไฟล์อยู่ ให้เขียนไปที่:
ถ้า (myFile) {
ในขณะที่ (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("ข้อผิดพลาดในการเปิด .txt");
}
}
////////เวลาอ่านหนังสือ
t = rtc.getTime();
tft.setTextColor(สีขาว);
/////////หากเวลามีการเปลี่ยนแปลง ให้แสดงการอ่านค่านาฬิกาใหม่
ถ้า ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // กำหนดตำแหน่งเคอร์เซอร์
tft.fillRect(118, 0, 50, 7, สีเทา); // การล้างพื้นที่เอาต์พุตเวลา
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // อ่านค่านาฬิกาเอาท์พุต
time_sec_prev = t.วินาที;
}
/////////หากวันที่มีการเปลี่ยนแปลง ให้แสดงวันที่ใหม่
ถ้า ( time_day_prev != t.date) {
tft.setCursor(180, 0); // กำหนดตำแหน่งเคอร์เซอร์
tft.fillRect(178, 0, 65, 7, สีเทา); // ล้างพื้นที่แสดงวันที่
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // แสดงการอ่านวันที่
time_day_prev = t.date;
}
/////////หากมีการรับสัญญาณวิทยุได้
ถ้า (radio.available(&ไปป์)) {
/////////ตรวจสอบว่าบัฟเฟอร์การรับเต็มหรือไม่
radio.read(&ข้อมูล, ขนาดของ (ข้อมูล));
/////////หากมีที่อยู่เครื่องส่งสัญญาณที่ต้องการ
ถ้า (ไปป์ == 1) {
///////// เรากำลังรอลำดับการซิงโครไนซ์ของศูนย์เพื่อพิจารณา
//จุดเริ่มต้นของบล็อกข้อมูล
ถ้า (ข้อมูล == 0000) {
อาร์ซี = 0;
} else {
อาร์ซี++;
}
///////// บันทึกค่าตัวนับและคำนวณในวันที่ 10 และ 100 ของชั่วโมง
ถ้า (rc == 1) {
leb_1 = ข้อมูล / 3600.0;
}

ถ้า (rc == 2) {
leb_2 = ข้อมูล / 3600.0;
}

ถ้า (rc == 3) {
leb_3 = ข้อมูล / 3600.0;
}

ถ้า (rc == 4) {
leb_4 = ข้อมูล / 3600.0;
}
}
}
ร++;
เค++; // แค่เคาน์เตอร์
///////// อัพเดทข้อมูลเป็นระยะๆ
ถ้า ( ร >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, สีเทา);
Serial.println("Lebedki I");
tft.setCursor(0, 41);
tft.println(leb_1);
Serial.println(leb_1);
tft.println(leb_2);
Serial.println(leb_2);
tft.println(leb_3);
Serial.println(leb_3);
tft.println(leb_4);
Serial.println(leb_4);
Serial.println(k);
ร = 0;
}
///////// เขียนข้อมูลลงสู่ระบบ SD ทุก ๆ 10 นาที
ถ้า ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(สีดำ);
///////// การสร้างสตริงในรูปแบบ .csv
สตริง dataString = สตริง (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
///////// เขียนไปยังไฟล์และส่งออกผลลัพธ์ของกระบวนการเขียน
myFile = SD.open (perv, FILE_WRITE); // หากไม่มีไฟล์ชื่อ “2.txt” ไฟล์นั้นจะถูกสร้างขึ้น
ถ้า (myFile) {
myFile.println(สตริงข้อมูล);
myFile.close();
tft.fillRect(198, 8, 42, 10, สีเขียว);
tft.println("SD ตกลง");
Serial.println("SD ตกลง");
ล่าช้า (900); // ล่าช้ามิฉะนั้นจะบันทึกการอ่านที่เหมือนกัน 13 ครั้งจนกระทั่งผ่านไปหนึ่งวินาที
} else {
tft.fillRect(198, 8, 42, 10, สีแดง);
tft.println("SD ผิดพลาด");
Serial.println("ข้อผิดพลาด SD");
}
}
}โปรแกรมแปลงตัวอักษร/* ถอดรหัสฟอนต์ภาษารัสเซียจาก UTF-8 เป็น Windows-1251 */

สตริง utf8rus (แหล่งสตริง)
{
ฉัน,k;
เป้าหมายสตริง;
ถ่านที่ไม่ได้ลงนาม n;
ถ่าน ม.[2] = { '0', ' ' };

k = แหล่งที่มา ความยาว (); ฉัน = 0;

ในขณะที่ (ฉัน <k) {
n = แหล่งที่มา [i]; ฉัน++;

ถ้า (n >= 0xC0) {
สวิตช์ (n) {
กรณี 0xD0: {
n = แหล่งที่มา [i]; ฉัน++;
ถ้า (n == 0x81) { n = 0xA8; หยุดพัก; }
ถ้า (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
กรณี 0xD1: {
n = แหล่งที่มา [i]; ฉัน++;
ถ้า (n == 0x91) { n = 0xB8; หยุดพัก; }
ถ้า (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
ม[0] = n; เป้าหมาย = เป้าหมาย + สตริง (m);
}
กลับเป้าหมาย;
} โปรแกรมแปลงรหัสอักขระสำหรับเอาต์พุต Cyrillic โดยใช้ไลบรารี Adafruit_GFX อยู่ในโฟลเดอร์เดียวกันกับโปรแกรมหลัก คุณต้องแทนที่ไฟล์ glcdfont.c ใน Adafruit_GFX ด้วยแบบอักษรอื่น ที่นี่ ห้องสมุดที่มีการทดแทนที่จำเป็น ข้อมูลเพิ่มเติมเกี่ยวกับ Russification สามารถพบได้ง่ายบนอินเทอร์เน็ต
โดยสรุป ผมจะบอกว่าระบบเป็นไปตามความคาดหวัง ทำให้ตรวจสอบเวลาการทำงานของอุปกรณ์ได้ง่ายขึ้น แม้ว่าทุกอย่างจะประกอบกันบนเขียงหั่นขนม แต่ก็ไม่มีการร้องเรียนเกี่ยวกับงานนี้ในทันที องค์ประกอบแรกทำงานมานานกว่าหกเดือนและรอดพ้นจากฤดูหนาว การออกแบบล่าสุด ใช้งานกับหน่วยควบคุม 9 หน่วยตั้งแต่วันที่ 5 มีนาคม และเวลาปฏิบัติการกำลังได้รับการลงทะเบียนอย่างเป็นทางการโดยใช้หน่วยควบคุม

ที่มา: will.com

เพิ่มความคิดเห็น