Sistem Perolehan Data Otonomi Daerah (lanjutan)

Mulai di situs ini ΠΏΠΎ ссылкС.
Opsi paling nyaman untuk mengambil informasi tentang menyalakan starter ternyata adalah opsi dengan optocoupler PC817. Diagram skematikSistem Perolehan Data Otonomi Daerah (lanjutan)Papan tersebut berisi tiga sirkuit identik, semuanya ditempatkan dalam kotak plastik ABS berukuran 100x100 mm. Foto optokoplerSistem Perolehan Data Otonomi Daerah (lanjutan) Saat dihubungkan ke perangkat start dengan katup semikonduktor, arus bocornya cukup untuk membuka PC817 dan penghitung akan terpicu secara salah. Untuk mengecualikan situasi seperti itu satu lagi ditambahkan secara seri pada rangkaian LED optocoupler dan LED indikasi pengoperasian. Untuk melakukan ini, jumper J1 dibuka dan LED1 LED tambahan disolder.
Bagian penerima dibuat sisi 1Sistem Perolehan Data Otonomi Daerah (lanjutan)sisi 2Sistem Perolehan Data Otonomi Daerah (lanjutan)papan pengembangan terhubung ke ARDUINO MEGA 2560. Untuk ini, konektor dua baris digunakan di bagian akhir. Layar dengan resolusi 240x400, memiliki layar sentuh resistif dan sensor suhu, digunakan sebagai perangkat tampilan informasi. HX8352B.Sistem Perolehan Data Otonomi Daerah (lanjutan) Apalagi konektor ke ICSP di screen board dilepas dan slot micro SD tidak digunakan. Faktanya adalah soket SD "asli" tidak dapat digunakan karena adanya konflik pada bus SPI. Untuk kartu flash, pembaca kartu terpisah digunakan, yang mencakup stabilizer 3,3V dan chip buffer dengan tiga status keluaran 74LVS125A. Di sinilah penggaruk menungguku. Buffer tiga keadaan, tetapi E01-ML01DP5 atau pembaca kartu berfungsi. Di komentar perpustakaan, SdFat melihat peringatan tentang ketidakcocokan dengan perangkat lain. Konverter level pada TXS0108E telah dilepas dan diganti dengan jumper, karena E01-ML01DP5 toleran terhadap sinyal 5V - itu tidak membantu. Menggunakan osiloskop, kehilangan sinyal terdeteksi pada jalur MISO ketika pembaca kartu dihubungkan. Setelah pemeriksaan yang cermat, ditemukan bahwa input sinyal pengaktifan saluran OE 4 74LVS125A hanya disolder ke kabel biasa dan tidak ada pembicaraan tentang keadaan ketiga mana pun. Chip buffer digunakan sebagai konverter level primitif dari 5V ke 3.3V menggunakan resistor 3,3 KΞ© yang dihubungkan secara seri dengan jalur sinyal. Kecuali jalur MISO. Sakelar bawah keluarannya mungkin menarik sinyal ke permukaan tanah. Setelah menentukan bahwa sinyal pengaktifan jalur MISO adalah pin 13, sinyal tersebut terputus dari jalur dandisolderSistem Perolehan Data Otonomi Daerah (lanjutan)antara pin input pilih perangkat 9LVS74A CS (125) dan resistor terminasi. Sekarang, jika tidak ada akses ke kartu memori, buffer MISO dinonaktifkan dan tidak mengganggu pengoperasian perangkat lain.Diagram papan pengembanganSistem Perolehan Data Otonomi Daerah (lanjutan)Penerima sedang beroperasiSistem Perolehan Data Otonomi Daerah (lanjutan)DS3231 menggunakan bus I2C perangkat lunak (TWI) untuk menghubungkan jam.
Program Arduino IDE// PENTING: PERPUSTAKAAN Adafruit_TFTLCD HARUS KHUSUS
// DIKONFIGURASI UNTUK TFT SHIELD ATAU BREAKOUT BOARD.
// LIHAT KOMENTAR RELEVAN DI Adafruit_TFTLCD.h UNTUK PENYIAPAN.
//oleh Tim Open-Smart dan Tim Catalex
//[email dilindungi]
//Toko: dx.com
// buka-smart.aliexpress.com/store/1199788
//Fungsi Demo: Menampilkan grafik, karakter
//Arduino IDE: 1.6.5
// Papan: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Papan: OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//TFT 3.2 INCI:
// 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
//BUKA-SMART 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

#termasuk // Pustaka grafis inti
//#termasuk // Pustaka khusus perangkat keras
#termasuk
MCUFRIEND_kbv tft;
#include "SdFat.h" // Gunakan perpustakaan SdFat
SdFat SD;
berkas SdFile;
File File saya;
#tentukan SD_CS_PIN SS

#termasuk // Hubungkan perpustakaan untuk bekerja dengan bus SPI
#termasuk // Hubungkan file pengaturan dari perpustakaan RF24
#termasuk // Hubungkan perpustakaan untuk bekerja dengan nRF24L24+
radio RF24 (47, 49);

#termasuk

DS3231 rtc(27, 25);
Waktu t;

uint16_t r = 6000;
uint32_t k = 0;

data panjang yang mudah menguap dan tidak ditandatangani;
mengapung leb_1;
mengapung leb_2;
mengapung leb_3;
mengapung leb_4;

pipa uint8_t;
int rc = 0;

uint8_t waktu_detik_prev;
uint8_t waktu_hari_prev;

//****************************************************** ***************/ /
// Jika Anda menggunakan papan breakout TFT OPEN-SMART //
// Merekomendasikan Anda untuk menambahkan rangkaian konversi level 5V-3.3V.
// Tentu saja Anda dapat menggunakan versi OPEN-SMART UNO Black dengan saklar daya 5V/3.3V,
// Anda hanya perlu beralih ke 3.3V.
// Pin kontrol untuk LCD dapat ditetapkan ke digital atau
// pin analog...tapi kita akan menggunakan pin analog jika memungkinkan
//-------------|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Hitam
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
//RD - A0
// Pertama - Atur Ulang
//LED-GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Menetapkan nama yang dapat dibaca manusia pada beberapa nilai warna 16-bit yang umum:
#definisikan HITAM 0x0000
#definisikan BIRU 0x001F
#definisikan MERAH 0xF800
#definisikan HIJAU 0x07E0
#definisikan CYAN 0x07FF
#definisikan MAGENTA 0xF81F
#definisikan KUNING 0xFFE0
#definisikan PUTIH 0xFFFF
#definisikan GREY 0x8C51
#definisikan GREYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Jika menggunakan perisai, semua jalur kontrol dan data diperbaiki, dan
// deklarasi yang lebih sederhana dapat digunakan secara opsional:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

String dataString;
//String numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//String *numfileMonth="1.txt" (sizeof (numfileMonth));
//////////////////////////////////////////////////////////// //////////////////

batal penyiapan (batal) {

rtc.begin();

// Untuk mengatur waktu, hapus komentar pada baris yang diperlukan
// rtc.setDOW(6); // Hari di minggu ini
// rtc.setTime(22, 04, 0); // Waktu, dalam format 24 jam.
// rtc.setDate(4, 5, 2019); // Tanggal, 29 Oktober 2018

Serial.begin (2000000);
//////// Inisialisasi layar
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(benar);
///////////////////Output nama, aksesori peralatan, nama organisasi
tft.fillScreen(HITAM);
tft.setTextColor(PUTIH);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("DEVELOPERS & MEMBANGUN");
tft.setCursor(30, 20);
tft.print (utf8rus("Konstruktor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
penundaan (2000);

radio.begin(); // Memulai pekerjaan nRF24L01+
radio.setChannel(120); // Tentukan saluran penerimaan data (dari 0 hingga 127)
radio.setDataRate(RF24_250KBPS); // Tentukan kecepatan transfer data (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Tentukan daya pemancar (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Buka 1 pipa dengan pengidentifikasi 1 pemancar 0xAABBCCDD11, untuk menerima data
// Buka pipa 2 dengan ID pemancar 2xAABBCCDD0 untuk menerima data
radio.mulaiMendengarkan(); // Nyalakan receiver, mulailah mendengarkan pipa terbuka
// radio.stopListening();
////////Output informasi layanan
tft.fillScreen(HITAM);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Mulai inisialisasi kartu SD
Serial.println("Kartu SD Awal");
tft.println("Kartu SD Awal");
tft.setCursor(8, 10);
////////Menginisialisasi kartu
jika (!SD.begin(SD_CS_PIN)) {
Serial.println("Awal gagal!");
tft.fillRect(8, 10, 85, 7, MERAH);
tft.setTextColor(HITAM);
tft.println("Awal gagal!");
kembali;
}
tft.setTextColor(PUTIH);
Serial.println("inisialisasi selesai");
tft.println("Inisialisasi selesai");
penundaan (2000);
////////Membaca waktu dan tanggal dan menugaskannya ke variabel
t = rtc.getTime();
time_sec_prev = t.detik;
waktu_hari_prev = t.tanggal;
//////// Menampilkan tanggal secara paksa agar tidak menunggu tanggal berubah untuk ditampilkan
tft.setCursor(180, 0); // mengatur posisi kursor
tft.fillRect(178, 0, 65, 7, GREY); // membersihkan area keluaran waktu
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Keluarkan nama objek kontrol
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Derek I"));
////////Membuat file log dan menampilkan hasil upaya pembuatan
tft.setTextSize(1);
tft.setCursor(130, 10); // jika file log 2.txt dibuat, maka penulisan ke file tersebut akan dilanjutkan
if (SD.ada(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // jika file 2.txt tidak ada, maka akan dibuat
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop (void) {
////////Memeriksa keberadaan permintaan untuk mengeluarkan log ke monitor port COM
if (Serial.tersedia() > 0) {
if (1 == Serial.baca());
////////Dan jika β€œ1” diterima, maka outputnya
File myFile = SD.open(perv);
// jika file tersedia, tulis ke dalamnya:
jika (File Saya) {
while (File Saya.tersedia()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("kesalahan saat membuka .txt");
}
}
////////Waktu membaca
t = rtc.getTime();
tft.setTextColor(PUTIH);
////////Jika waktu telah berubah, tampilkan pembacaan jam yang baru
jika ( time_sec_prev != t.detik) {
tft.setCursor(120, 0); // mengatur posisi kursor
tft.fillRect(118, 0, 50, 7, GREY); // membersihkan area keluaran waktu
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // pembacaan jam keluaran
time_sec_prev = t.detik;
}
////////Jika tanggal sudah berubah, tampilkan tanggal baru
jika ( waktu_hari_sebelumnya != t.tanggal) {
tft.setCursor(180, 0); // mengatur posisi kursor
tft.fillRect(178, 0, 65, 7, GREY); // menghapus area tampilan tanggal
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // menampilkan pembacaan tanggal
waktu_hari_prev = t.tanggal;
}
////////Jika penerimaan radio tersedia, maka
if (radio.tersedia(&pipa)) {
////////memeriksa apakah buffer penerimaan sudah penuh,
radio.baca(&data, ukuran(data));
////////jika alamat pemancar yang diperlukan tersedia, maka
jika (pipa == 1) {
////////menunggu urutan sinkronisasi angka nol untuk ditentukan
//awal blok data
jika (data == 0000) {
rc = 0;
} Else {
rc++;
}
////////Mencatat nilai penghitung dan menghitungnya dalam hitungan ke 10 dan 100 dalam satu jam
jika (rc == 1) {
leb_1 =data/3600.0;
}

jika (rc == 2) {
leb_2 =data/3600.0;
}

jika (rc == 3) {
leb_3 =data/3600.0;
}

jika (rc == 4) {
leb_4 =data/3600.0;
}
}
}
r++;
k++; // hanya penghitung
//////// Pemutakhiran data dengan periodisitas tertentu
jika ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GREYD);
Serial.println("Lebedki Saya");
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;
}
////////Tulis data ke log di SD setiap 10 menit.
if ((t.min % 10 == 0) && ( t.detik == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(HITAM);
////////Membuat string dalam format .csv
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Menulis ke file dan menampilkan hasil proses penulisan
myFile = SD.open(perv, FILE_WRITE); // jika tidak ada file bernama β€œ2.txt”, maka akan dibuat.
jika (File Saya) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, HIJAU);
tft.println("SD Oke");
Serial.println("SD OK");
penundaan(900); // tunda, jika tidak, catat 13 pembacaan yang identik hingga satu detik berlalu
} Else {
tft.fillRect(198, 8, 42, 10, MERAH);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Program konversi karakter/* Kode ulang font Rusia dari UTF-8 ke Windows-1251 */

String utf8rus(Sumber string)
{
ke dalam aku,k;
sasaran senar;
karakter yang tidak ditandatangani n;
karakter m[2] = { '0', ' ' };

k = sumber.panjang(); saya = 0;

sementara (saya < k) {
n = sumber[i]; saya++;

jika (n >= 0xC0) {
beralih (n) {
kasus 0xD0: {
n = sumber[i]; saya++;
jika (n == 0x81) { n = 0xA8; merusak; }
jika (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
kasus 0xD1: {
n = sumber[i]; saya++;
jika (n == 0x91) { n = 0xB8; merusak; }
jika (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; sasaran = sasaran + Tali(m);
}
target pengembalian;
}Program transcoding karakter untuk output Cyrillic menggunakan perpustakaan Adafruit_GFX ditempatkan di folder yang sama dengan program utama. Anda juga perlu mengganti file glcdfont.c di Adafruit_GFX dengan font yang berbeda. Di sini perpustakaan dengan pengganti yang diperlukan. Informasi lebih lanjut tentang Russifikasi dapat dengan mudah ditemukan di Internet.
Ringkasnya, saya akan mengatakan bahwa sistem telah memenuhi harapan, dan menjadi lebih mudah untuk memantau waktu pengoperasian peralatan. Meskipun semuanya dirakit di papan tempat memotong roti, tidak ada keluhan langsung mengenai pekerjaannya. Elemen pertama telah bekerja selama lebih dari enam bulan dan bertahan di musim dingin. Desain terbaru Ini telah berjalan untuk 9 unit yang dikendalikan sejak 5 Maret dan waktu pengoperasian terdaftar secara resmi menggunakannya.

Sumber: www.habr.com

Tambah komentar