เริ่มที่ไซต์นี้
ตัวเลือกที่สะดวกที่สุดในการดึงข้อมูลเกี่ยวกับการเปิดสตาร์ทเตอร์กลายเป็นตัวเลือกสำหรับออปโตคัปเปลอร์ PC817 แผนภาพวงจรกระดานประกอบด้วยวงจรที่เหมือนกันสามวงจร ทุกอย่างวางอยู่ในกล่องพลาสติก ABS ขนาด 100x100 มม. ภาพถ่ายของออปโตคัปเปลอร์ เมื่อเชื่อมต่อกับอุปกรณ์สตาร์ทที่มีวาล์วเซมิคอนดักเตอร์ กระแสรั่วไหลจะเพียงพอที่จะเปิด PC817 และเครื่องนับจะทริกเกอร์ผิดพลาด เพื่อยกเว้นสถานการณ์ดังกล่าว
ส่วนรับจะทำบน ด้าน 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
//[ป้องกันอีเมล]
//เก็บ:
//
//ฟังก์ชั่นสาธิต: แสดงกราฟิก, ตัวอักษร
// 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:
//
//เปิดสมาร์ท UNO R3 5V / 3.3V:
//
#รวม // ไลบรารีกราฟิกหลัก
//#รวม // ไลบรารี่เฉพาะฮาร์ดแวร์
#รวม
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 ด้วยแบบอักษรอื่น
โดยสรุป ผมจะบอกว่าระบบเป็นไปตามความคาดหวัง ทำให้ตรวจสอบเวลาการทำงานของอุปกรณ์ได้ง่ายขึ้น แม้ว่าทุกอย่างจะประกอบกันบนเขียงหั่นขนม แต่ก็ไม่มีการร้องเรียนเกี่ยวกับงานนี้ในทันที องค์ประกอบแรกทำงานมานานกว่าหกเดือนและรอดพ้นจากฤดูหนาว
ที่มา: will.com