Sistem Pemerolehan Data Autonomi Setempat (bersambung)

Mulakan di laman web ini ΠΏΠΎ ссылкС.
Pilihan yang paling mudah untuk mendapatkan maklumat tentang menghidupkan pemula ternyata menjadi pilihan dengan optocoupler PC817. Gambarajah skematikSistem Pemerolehan Data Autonomi Setempat (bersambung)Papan mengandungi tiga litar yang sama, semuanya diletakkan di dalam kotak plastik ABS, saiz 100x100 mm. Foto optocouplerSistem Pemerolehan Data Autonomi Setempat (bersambung) Apabila disambungkan kepada memulakan peranti dengan injap semikonduktor, arus bocornya mencukupi untuk membuka PC817 dan kaunter akan mencetus secara palsu. Untuk mengecualikan keadaan sedemikian satu lagi ditambah secara bersiri pada litar LED optocoupler dan LED petunjuk operasi. Untuk melakukan ini, pelompat J1 dibuka dan LED1 LED tambahan dipateri masuk.
Bahagian penerima dibuat pada sebelah 1Sistem Pemerolehan Data Autonomi Setempat (bersambung)sebelah 2Sistem Pemerolehan Data Autonomi Setempat (bersambung)papan pembangunan disambungkan ke ARDUINO MEGA 2560. Untuk ini, penyambung dua baris digunakan pada hujungnya. Skrin dengan resolusi 240x400, mempunyai skrin sentuh rintangan dan sensor suhu, digunakan sebagai peranti paparan maklumat. HX8352B.Sistem Pemerolehan Data Autonomi Setempat (bersambung) Selain itu, penyambung kepada ICSP pada papan skrin dikeluarkan dan slot SD mikro tidak digunakan. Hakikatnya ialah soket SD "asli" tidak boleh digunakan kerana konflik pada bas SPI. Untuk kad kilat, pembaca kad berasingan telah digunakan, termasuk penstabil 3,3V dan cip penimbal dengan tiga keadaan keluaran 74LVS125A. Di sinilah garu sedang menunggu saya. Penampan tiga keadaan, tetapi sama ada E01-ML01DP5 atau pembaca kad berfungsi. Dalam ulasan perpustakaan, SdFat melihat amaran tentang ketidakserasian dengan peranti lain. Penukar aras pada TXS0108E telah dikeluarkan dan digantikan dengan pelompat, kerana E01-ML01DP5 bertolak ansur dengan isyarat 5V - ia tidak membantu. Menggunakan osiloskop, kehilangan isyarat dikesan pada talian MISO apabila pembaca kad disambungkan. Setelah pemeriksaan teliti, didapati bahawa input isyarat pemboleh saluran OE 4 74LVS125A hanya dipateri pada wayar biasa dan tidak boleh bercakap tentang mana-mana keadaan ketiga. Cip penimbal digunakan sebagai penukar aras primitif daripada 5V kepada 3.3V menggunakan perintang 3,3 KΞ© yang disambungkan secara bersiri dengan garis isyarat. Kecuali talian MISO. Suis bawah keluarannya mungkin menarik isyarat ke aras tanah. Setelah menentukan bahawa isyarat membolehkan talian MISO ialah pin 13, ia telah tercabut dari trek dandipateriSistem Pemerolehan Data Autonomi Setempat (bersambung)antara pin input pilih peranti 9LVS74A CS (125) dan perintang penamatan. Sekarang, jika tiada akses kepada kad memori, penimbal MISO dinyahdayakan dan tidak mengganggu pengendalian peranti lain.Gambar rajah papan pembangunanSistem Pemerolehan Data Autonomi Setempat (bersambung)Penerima sedang beroperasiSistem Pemerolehan Data Autonomi Setempat (bersambung)DS3231 menggunakan bas perisian I2C (TWI) untuk menyambungkan jam.
Program IDE Arduino// PENTING: PERPUSTAKAAN Adafruit_TFTLCD MESTILAH SECARA KHUSUS
// DIKONFIGURASI UNTUK SAMA ADA TFT SHIELD ATAU PAPAN BREAKOUT.
// LIHAT KOMEN BERKAITAN DALAM Adafruit_TFTLCD.h UNTUK PENYEDIAAN.
//oleh Open-Smart Team dan Catalex Team
//[e-mel dilindungi]
//Kedai: dx.com
// open-smart.aliexpress.com/store/1199788
//Fungsi Demo: Paparkan grafik, aksara
//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
//3.2 INCI 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
//OPEN-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 grafik teras
//#include // Pustaka khusus perkakasan
#termasuk
MCUFRIEND_kbv tft;
#include "SdFat.h" // Gunakan perpustakaan SdFat
SdFat SD;
Fail SdFile;
Fail myFile;
#define SD_CS_PIN SS

#termasuk // Sambungkan perpustakaan untuk bekerja dengan bas SPI
#termasuk // Sambungkan fail tetapan daripada pustaka RF24
#termasuk // Sambungkan perpustakaan untuk berfungsi dengan nRF24L24+
Radio RF24(47, 49);

#termasuk

DS3231 rtc(27, 25);
Masa t;

uint16_t r = 6000;
uint32_t k = 0;

data panjang yang tidak menentu;
terapung leb_1;
terapung leb_2;
terapung leb_3;
terapung leb_4;

paip uint8_t;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ ****************/ /
// Jika anda menggunakan papan pecah TFT OPEN-SMART //
// Mengesyorkan anda untuk menambah litar penukar aras 5V-3.3V.
// Sudah tentu anda boleh menggunakan versi OPEN-SMART UNO Black dengan suis kuasa 5V/3.3V,
// anda hanya perlu bertukar kepada 3.3V.
// Pin kawalan untuk LCD boleh diberikan kepada mana-mana digital atau
// pin analog...tetapi kami akan menggunakan pin analog kerana ini membolehkan kami melakukannya
//β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - TETAP SEMULA
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Berikan nama yang boleh dibaca manusia kepada beberapa nilai warna 16-bit biasa:
#define HITAM 0x0000
#define BIRU 0x001F
#takrifkan MERAH 0xF800
#define HIJAU 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#takrifkan KUNING 0xFFE0
#define WHITE 0xFFFF
#define KELABU 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Jika menggunakan perisai, semua talian kawalan dan data ditetapkan, dan
// pengisytiharan yang lebih mudah boleh digunakan secara pilihan:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

persediaan kosong (kekosongan) {

rtc.begin();

// Untuk menetapkan masa, nyahkomen baris yang diperlukan
// rtc.setDOW(6); // Hari dalam seminggu
// rtc.setTime(22, 04, 0); // Masa, dalam format 24 jam.
// rtc.setDate(4, 5, 2019); // Tarikh, 29 Oktober 2018

Serial.begin (2000000);
//////// Permulaan skrin
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("PEMBANGUN & BINA");
tft.setCursor(30, 20);
tft.print (utf8rus("Pembina V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
kelewatan (2000);

radio.begin(); // Mulakan kerja nRF24L01+
radio.setChannel(120); // Tentukan saluran penerimaan data (dari 0 hingga 127)
radio.setDataRate(RF24_250KBPS); // Nyatakan kadar pemindahan data (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Nyatakan kuasa pemancar (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Buka 1 paip dengan pengecam 1 pemancar 0xAABBCCDD11, untuk menerima data
// Buka paip 2 dengan ID pemancar 2xAABBCCDD0 untuk menerima data
radio.startListening(); // Hidupkan penerima, mula mendengar paip terbuka
// radio.stopListening();
////////Output maklumat perkhidmatan
tft.fillScreen(HITAM);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Mula memulakan kad SD
Serial.println("Kad SD awal");
tft.println("Kad SD awal");
tft.setCursor(8, 10);
////////Memulakan kad
jika (!SD.begin(SD_CS_PIN)) {
Serial.println("awal gagal!");
tft.fillRect(8, 10, 85, 7, MERAH);
tft.setTextColor(BLACK);
tft.println("Awal gagal!");
kembali;
}
tft.setTextColor(PUTIH);
Serial.println("inisialisasi selesai");
tft.println("Pemulaan selesai");
kelewatan (2000);
////////Membaca masa dan tarikh dan memberikannya kepada pembolehubah
t = rtc.getTime();
time_sec_prev = t.sec;
masa_hari_sebelumnya = t.tarikh;
////////Keluarkan tarikh secara paksa supaya tidak menunggu tarikh bertukar untuk paparan
tft.setCursor(180, 0); // menetapkan kedudukan kursor
tft.fillRect(178, 0, 65, 7, KELABU); // mengosongkan kawasan keluaran masa
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Keluarkan nama objek kawalan
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
////////Mencipta fail log dan mengeluarkan hasil percubaan penciptaan
tft.setTextSize(1);
tft.setCursor(130, 10); // jika fail log 2.txt dicipta, maka penulisan ke fail akan diteruskan
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Lain {
myFile = SD.open(perv, FILE_WRITE); // jika fail 2.txt tidak wujud, ia akan dibuat
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

gelung kosong (kekosongan) {
////////Menyemak kewujudan permintaan untuk mengeluarkan log ke monitor port COM
jika (Serial.available() > 0) {
if (1 == Serial.read());
////////Dan jika β€œ1” diterima, maka keluarannya
Fail myFile = SD.open(perv);
// jika fail itu tersedia, tulis kepadanya:
jika (myFile) {
manakala (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
lain {
Serial.println("ralat membuka .txt");
}
}
////////Waktu membaca
t = rtc.getTime();
tft.setTextColor(PUTIH);
////////Jika masa telah berubah, kemudian paparkan bacaan jam baharu
jika ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // menetapkan kedudukan kursor
tft.fillRect(118, 0, 50, 7, KELABU); // mengosongkan kawasan keluaran masa
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // bacaan jam keluaran
time_sec_prev = t.sec;
}
////////Jika tarikh telah berubah, maka paparkan tarikh baharu
jika ( masa_hari_sebelumnya != t.tarikh) {
tft.setCursor(180, 0); // menetapkan kedudukan kursor
tft.fillRect(178, 0, 65, 7, KELABU); // jelas kawasan paparan tarikh
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // memaparkan bacaan tarikh
masa_hari_sebelumnya = t.tarikh;
}
////////Jika penerimaan radio tersedia, maka
jika (radio.available(&paip)) {
////////semak sama ada penimbal terima penuh,
radio.read(&data, sizeof(data));
////////jika alamat pemancar yang diperlukan tersedia, maka
jika (paip == 1) {
////////menunggu urutan penyegerakan sifar untuk ditentukan
//permulaan blok data
jika (data == 0000) {
rc = 0;
} Lain {
rc++;
}
////////Merakam nilai pembilang dan mengiranya dalam 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 kaunter
//////// Kemas kini data dengan berkala tertentu
jika ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, KELABU);
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;
}
////////Tulis data ke log pada SD setiap 10 minit.
jika ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Mencipta rentetan dalam format .csv
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ "," + (leb_3) + "," + (leb_4) + ",";
////////Tulis ke fail dan keluarkan hasil proses penulisan
myFile = SD.open(perv, FILE_WRITE); // jika tiada fail bernama "2.txt", ia akan dibuat.
jika (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, HIJAU);
tft.println("SD OK");
Serial.println("SD OK");
kelewatan(900); // kelewatan, jika tidak merekodkan 13 bacaan yang sama sehingga satu saat berlalu
} Lain {
tft.fillRect(198, 8, 42, 10, MERAH);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Program penukaran watak/* Kod semula fon Rusia dari UTF-8 ke Windows-1251 */

String utf8rus(Sumber rentetan)
{
int i,k;
Sasaran rentetan;
aksara tidak bertanda n;
char m[2] = { '0', ' ' };

k = source.length(); i = 0;

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

jika (n >= 0xC0) {
suis (n) {
kes 0xD0: {
n = sumber[i]; i++;
jika (n == 0x81) { n = 0xA8; pecah; }
jika (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
memecahkan;
}
kes 0xD1: {
n = sumber[i]; i++;
jika (n == 0x91) { n = 0xB8; pecah; }
jika (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
memecahkan;
}
}
}
m[0] = n; sasaran = sasaran + Rentetan(m);
}
sasaran pulangan;
}Program transcoding aksara untuk output Cyrillic menggunakan perpustakaan Adafruit_GFX diletakkan dalam folder yang sama dengan program utama. Anda juga perlu menggantikan fail glcdfont.c dalam Adafruit_GFX dengan fon yang berbeza. ia adalah perpustakaan dengan penggantian yang diperlukan. Maklumat lanjut tentang Russification boleh didapati dengan mudah di Internet.
Untuk meringkaskan, saya akan mengatakan bahawa sistem memenuhi jangkaan, menjadi lebih mudah untuk memantau masa operasi peralatan. Walaupun semuanya dipasang pada papan roti, tiada aduan segera mengenai kerja itu. Elemen pertama telah bekerja selama lebih daripada enam bulan dan telah bertahan pada musim sejuk. Reka bentuk terkini Ia telah berjalan untuk 9 unit terkawal sejak 5 Mac dan waktu operasi sedang didaftarkan secara rasmi menggunakannya.

Sumber: www.habr.com

Tambah komen