Bắt đầu trên trang web này .
Tùy chọn thuận tiện nhất để lấy thông tin về việc bật bộ khởi động hóa ra là tùy chọn với bộ ghép quang PC817. sơ đồ mạch
Các bảng chứa ba mạch giống hệt nhau, mọi thứ được đặt trong hộp nhựa ABS, kích thước 100x100 mm. Hình ảnh của bộ ghép quang
Khi kết nối với các thiết bị khởi động bằng van bán dẫn, dòng điện rò của chúng đủ để mở PC817 và bộ đếm sẽ kích hoạt sai. Để loại trừ tình huống như vậy một cái nữa được thêm nối tiếp vào mạch của đèn LED ghép quang và đèn LED chỉ báo hoạt động. Để thực hiện việc này, jumper J1 được mở ra và một đèn LED LED1 bổ sung được hàn vào.
Phần tiếp nhận được thực hiện trên bên 1
bên 2
bảng phát triển được kết nối với ARDUINO MEGA 2560. Đối với điều này, một đầu nối hai hàng được sử dụng ở cuối. Màn hình có độ phân giải 240x400, có màn hình cảm ứng điện trở và cảm biến nhiệt độ, được sử dụng làm thiết bị hiển thị thông tin. HX8352B.
Hơn nữa, đầu nối với ICSP trên bo mạch màn hình đã bị loại bỏ và khe cắm micro SD không được sử dụng. Thực tế là không thể sử dụng ổ cắm SD "gốc" do xung đột trên bus SPI. Đối với thẻ flash, một đầu đọc thẻ riêng biệt đã được sử dụng, bao gồm bộ ổn định 3,3V và chip đệm với ba trạng thái đầu ra 74LVS125A. Đây là nơi mà cái cào đang đợi tôi. Bộ đệm ba trạng thái, nhưng E01-ML01DP5 hoặc đầu đọc thẻ đều hoạt động. Trong phần nhận xét của thư viện, SdFat thấy cảnh báo về tính không tương thích với các thiết bị khác. Bộ chuyển đổi mức trên TXS0108E đã bị loại bỏ và thay thế bằng bộ nhảy, bởi vì E01-ML01DP5 có khả năng chịu được tín hiệu 5V - điều đó không giúp ích gì. Sử dụng máy hiện sóng, tín hiệu được phát hiện trên đường MISO khi đầu đọc thẻ được kết nối. Sau khi kiểm tra cẩn thận, người ta phát hiện ra rằng đầu vào của tín hiệu kích hoạt của các kênh OE 4 của 74LVS125A chỉ được hàn vào một dây chung và không thể nói đến bất kỳ trạng thái thứ ba nào. Chip đệm được sử dụng làm bộ chuyển đổi mức nguyên thủy từ 5V sang 3.3V bằng cách sử dụng điện trở 3,3 KΩ mắc nối tiếp với các đường tín hiệu. Ngoại trừ dòng MISO. Công tắc phía dưới đầu ra của nó có thể thu hút tín hiệu xuống mặt đất. Sau khi xác định rằng tín hiệu kích hoạt của đường MISO là chân 13, nó đã bị đứt khỏi đường ray vàhàn
giữa chân đầu vào chọn thiết bị 9LVS74A CS (125) và điện trở kết thúc. Bây giờ, nếu không có quyền truy cập vào thẻ nhớ, bộ đệm MISO sẽ bị tắt và không can thiệp vào hoạt động của thiết bị khác.Sơ đồ bảng phát triển
Máy thu đang hoạt động
DS3231 sử dụng bus I2C phần mềm (TWI) để kết nối đồng hồ.
Chương trình Arduino IDE// QUAN TRỌNG: THƯ VIỆN Adafbean_TFTLCD PHẢI ĐẶC BIỆT
// ĐƯỢC CẤU HÌNH CHO HOẶC MÀN HÌNH TFT HOẶC BẢNG ĐỘT PHÁ.
// XEM NHẬN XÉT LIÊN QUAN TRONG Adafruit_TFTLCD.h ĐỂ THIẾT LẬP.
//bởi Nhóm Open-Smart và Nhóm Catalex
//catalex_inc@163.com
//Cửa hàng:
//
// Chức năng Demo: Hiển thị đồ họa, ký tự
// IDE Arduino: 1.6.5
// Bo mạch: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo
// Bo mạch: OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//Màn hình 3.2INCH:
//
// MỞ-SMART UNO R3 5V / 3.3V:
//
#bao gồm // Thư viện đồ họa lõi
//#bao gồm // Thư viện dành riêng cho phần cứng
#bao gồm
MCUFRIEND_kbv tft;
#include "SdFat.h" // Sử dụng thư viện SdFat
SdFat SD;
Tệp SdFile;
Gửi myFile;
#define SD_CS_PIN SS
#bao gồm // Kết nối thư viện để làm việc với bus SPI
#bao gồm // Kết nối file cài đặt từ thư viện RF24
#bao gồm // Kết nối thư viện để làm việc với nRF24L24+
đài RF24(47, 49);
#bao gồm
DS3231 rtc(27, 25);
Thời gian t;
uint16_t r = 6000;
uint32_t k = 0;
dữ liệu dài không dấu dễ bay hơi;
thả nổi leb_1;
thả nổi leb_2;
thả nổi leb_3;
thả nổi leb_4;
ống uint8_t;
intrc = 0;
uint8_t time_sec_prev;
uint8_t time_day_prev;
//************************************************ ****************/ /
// Nếu bạn sử dụng bảng đột phá OPEN-SMART TFT //
// Đề nghị bổ sung thêm mạch chuyển đổi mức 5V-3.3V.
// Tất nhiên bạn có thể sử dụng phiên bản OPEN-SMART UNO Black với công tắc nguồn 5V/3.3V,
// bạn chỉ cần chuyển sang 3.3V.
// Các chân điều khiển của LCD có thể được gán cho bất kỳ chân kỹ thuật số hoặc
// các chân analog...nhưng chúng ta sẽ sử dụng các chân analog vì điều này cho phép chúng ta
//——————————————-|
// Đột phá TFT - Arduino UNO / Mega2560 / OPEN-SMART UNO Đen
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - THIẾT LẬP LẠI
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7
// Gán tên mà con người có thể đọc được cho một số giá trị màu 16 bit phổ biến:
#xác định ĐEN 0x0000
#define XANH 0x001F
#define ĐỎ 0xF800
#define XANH 0x07E0
#define CYAN 0x07FF
#define Màu đỏ tươi 0xF81F
#xác định VÀNG 0xFFE0
#define TRẮNG 0xFFFF
#define GRAY 0x8C51
#define GRAYD 0x39E7
// Adafbean_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Nếu sử dụng tấm chắn, tất cả các dòng điều khiển và dữ liệu sẽ được cố định và
// một khai báo đơn giản hơn có thể được sử dụng tùy ý:
// Adaf nhung_TFTLCD tft;
uint16_t g_identifier;
Chuỗi dữ liệuString;
//Chuỗi numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//Chuỗi *numfileMonth="1.txt" (sizeof (numfileMonth));
///////////////////////////////////////////////////////////////// // ///////////////
thiết lập void (void) {
rtc.begin();
// Để đặt thời gian, bỏ ghi chú các dòng cần thiết
// rtc.setDOW(6); // Ngày trong tuần
// rtc.setTime(22, 04, 0); // Thời gian, ở định dạng 24 giờ.
// rtc.setDate(4, 5, 2019); // Ngày, 29 tháng 2018 năm XNUMX
Serial.begin (2000000);
//////// Khởi tạo màn hình
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(đúng);
//////////////////Xuất tên, phụ kiện thiết bị, tên tổ chức
tft.fillScreen(ĐEN);
tft.setTextColor(TRẮNG);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("NHÀ PHÁT TRIỂN & XÂY DỰNG");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
độ trễ (2000);
radio.begin(); // Bắt đầu công việc nRF24L01+
radio.setChannel(120); // Chỉ định kênh nhận dữ liệu (từ 0 đến 127)
radio.setDataRate(RF24_250KBPS); // Chỉ định tốc độ truyền dữ liệu (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Chỉ định công suất phát (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Mở 1 pipe có định danh 1 máy phát 0xAABBCCDD11, để nhận dữ liệu
// Mở pipe 2 với ID máy phát 2xAABBCCDD0 để nhận dữ liệu
radio.startListening(); // Bật máy thu, bắt đầu nghe ống mở
// radio.stopListening();
////////Đầu ra thông tin dịch vụ
tft.fillScreen(ĐEN);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Bắt đầu khởi tạo thẻ SD
Serial.println("Thẻ SD ban đầu");
tft.println("Thẻ SD ban đầu");
tft.setCursor(8, 10);
////////Khởi tạo thẻ
if (!SD.begin(SD_CS_PIN)) {
Serial.println("ban đầu thất bại!");
tft.fillRect(8, 10, 85, 7, ĐỎ);
tft.setTextColor(ĐEN);
tft.println("Lần đầu thất bại!");
trở về;
}
tft.setTextColor(TRẮNG);
Serial.println("khởi tạo xong");
tft.println("Khởi tạo xong");
độ trễ (2000);
////////Đọc ngày, giờ và gán chúng cho các biến
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Buộc xuất ngày để không phải đợi ngày thay đổi để hiển thị
tft.setCursor(180, 0); // thiết lập vị trí con trỏ
tft.fillRect(178, 0, 65, 7, GRAY); // xóa vùng đầu ra thời gian
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Xuất tên đối tượng điều khiển
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Tời tôi"));
////////Tạo một tệp nhật ký và xuất ra kết quả của lần tạo
tft.setTextSize(1);
tft.setCursor(130, 10); // nếu tệp nhật ký 2.txt được tạo thì việc ghi vào tệp sẽ tiếp tục
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // nếu file 2.txt không tồn tại thì nó sẽ được tạo
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}
vòng lặp void (void) {
////////Kiểm tra sự tồn tại của yêu cầu xuất nhật ký tới màn hình cổng COM
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Và nếu “1” được chấp nhận thì đầu ra
Tệp myFile = SD.open(perv);
// nếu file có sẵn, hãy ghi vào nó:
nếu (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
khác {
Serial.println("lỗi mở .txt");
}
}
////////Thời gian đọc
t = rtc.getTime();
tft.setTextColor(TRẮNG);
////////Nếu thời gian đã thay đổi, hãy hiển thị chỉ số đồng hồ mới
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // thiết lập vị trí con trỏ
tft.fillRect(118, 0, 50, 7, GRAY); // xóa vùng đầu ra thời gian
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // xuất số liệu đồng hồ
time_sec_prev = t.sec;
}
////////Nếu ngày đã thay đổi thì hiển thị ngày mới
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // thiết lập vị trí con trỏ
tft.fillRect(178, 0, 65, 7, GRAY); // xóa vùng hiển thị ngày
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // hiển thị số đọc ngày
time_day_prev = t.date;
}
////////Nếu có khả năng thu sóng vô tuyến thì
if (radio.available(&pipe)) {
////////kiểm tra xem bộ đệm nhận có đầy không,
radio.read(&data, sizeof(data));
////////nếu địa chỉ máy phát được yêu cầu có sẵn thì
nếu (ống == 1) {
////////đợi chuỗi số 0 đồng bộ hóa để xác định
//bắt đầu khối dữ liệu
nếu (dữ liệu == 0000) {
rc = 0;
} Else {
RC++;
}
////////Ghi lại các giá trị của bộ đếm và tính toán chúng ở phần 10 và 100 của một giờ
nếu (rc == 1) {
leb_1 = dữ liệu / 3600.0;
}
nếu (rc == 2) {
leb_2 = dữ liệu / 3600.0;
}
nếu (rc == 3) {
leb_3 = dữ liệu / 3600.0;
}
nếu (rc == 4) {
leb_4 = dữ liệu / 3600.0;
}
}
}
r++;
k++; // chỉ là một bộ đếm
//////// Cập nhật dữ liệu theo chu kỳ nhất định
nếu ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GRAYD);
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);
r = 0;
}
////////Ghi dữ liệu vào nhật ký trên SD cứ sau 10 phút.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(ĐEN);
////////Tạo chuỗi ở định dạng .csv
Chuỗi dataString = Chuỗi (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Ghi vào file và xuất ra kết quả của quá trình ghi
myFile = SD.open(perv, FILE_WRITE); // nếu không có file có tên “2.txt”, nó sẽ được tạo.
nếu (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, XANH);
tft.println("SD OK");
Serial.println("SD OK");
độ trễ (900); // trì hoãn, nếu không thì ghi 13 lần đọc giống hệt nhau cho đến khi một giây trôi qua
} Else {
tft.fillRect(198, 8, 42, 10, ĐỎ);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Chương trình chuyển đổi ký tự/* Chuyển đổi phông chữ tiếng Nga từ UTF-8 sang Windows-1251 */
Chuỗi utf8rus(Nguồn chuỗi)
{
int tôi,k;
Mục tiêu chuỗi;
ký tự không dấu n;
char m[2] = { '0', ' ' };
k = source.length(); tôi = 0;
trong khi (i < k) {
n = nguồn[i]; tôi++;
nếu (n >= 0xC0) {
chuyển đổi (n) {
trường hợp 0xD0: {
n = nguồn[i]; tôi++;
nếu (n == 0x81) { n = 0xA8; phá vỡ; }
nếu (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
phá vỡ;
}
trường hợp 0xD1: {
n = nguồn[i]; tôi++;
nếu (n == 0x91) { n = 0xB8; phá vỡ; }
nếu (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
phá vỡ;
}
}
}
m[0] = n; mục tiêu = mục tiêu + Chuỗi (m);
}
trả lại mục tiêu;
}Chương trình chuyển mã ký tự cho đầu ra Cyrillic sử dụng thư viện Adafruit_GFX được đặt trong cùng thư mục với chương trình chính. Bạn cũng cần thay thế tệp glcdfont.c trong Adafruit_GFX bằng một phông chữ khác. thư viện với sự thay thế cần thiết. Thông tin thêm về Nga hóa có thể dễ dàng tìm thấy trên Internet.
Tóm lại, tôi sẽ nói rằng hệ thống đã đáp ứng được mong đợi, việc theo dõi thời gian hoạt động của thiết bị đã trở nên dễ dàng hơn. Mặc dù mọi thứ đều được lắp ráp trên bảng mạch, nhưng không có lời phàn nàn nào ngay lập tức về công việc. Những phần tử đầu tiên đã hoạt động được hơn sáu tháng và đã sống sót qua mùa đông. Nó đã chạy cho 9 đơn vị được kiểm soát từ ngày 5/XNUMX và thời gian hoạt động đang được đăng ký chính thức sử dụng.
Nguồn: www.habr.com
