Sistem Akuisisi Data Otonom Lokal (Lanjutan)

Mulai ing situs iki link.
Pilihan sing paling trep kanggo njupuk informasi babagan nguripake wiwitan dadi pilihan karo optocoupler PC817. Diagram sirkuitSistem Akuisisi Data Otonom Lokal (Lanjutan)Papan kasebut ngemot telung sirkuit sing padha, kabeh diselehake ing kothak plastik ABS, ukuran 100x100 mm. Foto saka optocouplerSistem Akuisisi Data Otonom Lokal (Lanjutan) Nalika disambungake kanggo miwiti piranti karo klep semikonduktor, arus bocor cukup kanggo mbukak PC817 lan counter bakal micu palsu. Kanggo ngilangi kahanan kasebut siji liyane ditambahake ing seri kanggo sirkuit saka LED optocoupler lan LED indikasi operasi. Kanggo nindakake iki, jumper J1 dibukak lan LED tambahan LED1 soldered ing.
Bagian panampa digawe ing sisih 1Sistem Akuisisi Data Otonom Lokal (Lanjutan)sisih 2Sistem Akuisisi Data Otonom Lokal (Lanjutan)Papan pangembangan disambungake menyang ARDUINO MEGA 2560. Kanggo iki, konektor pindho baris digunakake ing mburi. Layar kanthi resolusi 240x400, nduweni layar demek resistif lan sensor suhu, digunakake minangka piranti tampilan informasi. HX8352B.Sistem Akuisisi Data Otonom Lokal (Lanjutan) Menapa malih, konektor kanggo ICSP ing Papan layar dibusak lan slot micro SD ora digunakake. Kasunyatane yaiku soket SD "native" ora bisa digunakake amarga konflik ing bis SPI. Kanggo kertu lampu kilat, maca kertu kapisah digunakake, kalebu stabilizer 3,3V lan chip buffer kanthi telung negara output 74LVS125A. Iki ngendi garu nunggu aku. A buffer telung negara, nanging salah siji E01-ML01DP5 utawa maca kertu makarya. Ing komentar perpustakaan, SdFat ndeleng bebaya babagan ora kompatibel karo piranti liyane. Konverter tingkat ing TXS0108E dibusak lan diganti karo jumper, amarga E01-ML01DP5 toleran kanggo sinyal 5V - ora mbantu. Nggunakake oscilloscope, mundhut sinyal dideteksi ing baris MISO nalika maca kertu disambungake. Sawise mriksa kanthi ati-ati, ditemokake yen input sinyal aktif saka saluran OE 4 saka 74LVS125A mung disolder menyang kabel umum lan ora bisa ngomong babagan negara katelu. Chip buffer digunakake minangka konverter tingkat primitif saka 5V dadi 3.3V nggunakake resistor 3,3 KΞ© sing disambungake kanthi seri karo garis sinyal. Kajaba kanggo garis MISO. Saklar ngisor output mbokmenawa narik sinyal menyang tingkat lemah. Sawise nemtokake manawa sinyal ngaktifake garis MISO yaiku pin 13, mula dicopot saka trek landisolderSistem Akuisisi Data Otonom Lokal (Lanjutan)antarane piranti 9LVS74A CS pilih pin input (125) lan resistor mandap. Saiki, yen ora ana akses menyang kertu memori, buffer MISO dipateni lan ora ngganggu operasi piranti liyane.Diagram papan pangembanganSistem Akuisisi Data Otonom Lokal (Lanjutan)Panrima ing operasiSistem Akuisisi Data Otonom Lokal (Lanjutan)DS3231 nggunakake bis I2C software (TWI) kanggo nyambungake jam.
Program Arduino IDE// PENTING: PERPUSTAKAAN Adafruit_TFTLCD kudu khusus
// Dikonfigurasi kanggo salah siji TFT SHIELD UTAWA BREAKOUT BOARD.
// NDELENG KOMENTAR RELEVAN IN Adafruit_TFTLCD.h FOR SETUP.
//dening Open-Smart Team lan Catalex Team
//[email dilindhungi]
//Toko: dx.com
// open-smart.aliexpress.com/store/1199788
// Fungsi Demo: Tampilan grafis, 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
//3.2 INCH 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

#kalebu // Pustaka grafis inti
//#include // Pustaka khusus hardware
#kalebu
MCUFRIEND_kbv tft;
#include "SdFat.h" // Gunakake perpustakaan SdFat
SdFat SD;
SdFile file;
File myFile;
#define SD_CS_PIN SS

#include // Kalebu perpustakaan kanggo nggarap bis SPI
#include // Kalebu file setelan saka perpustakaan RF24
#include // Kalebu perpustakaan kanggo nggarap nRF24L24+
Radio RF24(47, 49);

#kalebu

DS3231 rtc(27, 25);
Wektu t;

uint16_t r = 6000;
uint32_t k = 0;

data dawa tanpa tandha molah malih;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

pipa uint8_t;
int rc = 0;

uint8_t time_sec_prev;
uint8_t wektu_dina_prev;

//************************************************ *****************//
// Yen sampeyan nggunakake papan breakout OPEN-SMART TFT //
// Recommend sampeyan nambah sirkuit 5V-3.3V tingkat Ngonversi.
// Mesthi sampeyan bisa nggunakake versi OPEN-SMART UNO Black kanthi switch daya 5V / 3.3V,
// sampeyan mung kudu ngalih menyang 3.3V.
// Pin kontrol kanggo LCD bisa diutus kanggo sembarang digital utawa
// pin analog ... nanging kita bakal nggunakake pin analog minangka iki ngidini kita
//β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - RESET
// LED - GND
//DB0 - 8
//DB1 - 9
//DB2 - 10
//DB3 - 11
//DB4 - 4
//DB5 - 13
//DB6 - 6
//DB7 - 7

// Temtokake jeneng sing bisa diwaca manungsa menyang sawetara nilai warna 16-bit sing umum:
#define BLACK 0x0000
#define BIRU 0x001F
#define RED 0xF800
#define Ijo 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define KUNING 0xFFE0
#netepake PUTIH 0xFFFF
#define KELABU 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Yen nggunakake tameng, kabeh kontrol lan data baris tetep, lan
// deklarasi sing luwih prasaja bisa digunakake kanthi opsional:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

persiyapan batal (batal) {

rtc.begin();

// Kanggo nyetel wektu, uncomment baris perlu
// rtc.setDOW(6); // Dina minggu
// rtc.setTime(22, 04, 0); // Wektu, ing 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(bener);
//////////////////Output jeneng, aksesoris peralatan, jeneng organisasi
tft.fillScreen(Ireng);
tft.setTextColor(PUTIH);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("PENGEMBANG & BANGUN");
tft.setCursor(30, 20);
tft.print (utf8rus("Konstruktor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I"));
tundha (2000);

radio.begin(); // Miwiti karya nRF24L01+
radio.setChannel(120); // Nemtokake saluran panrima data (saka 0 nganti 127)
radio.setDataRate(RF24_250KBPS); // Nemtokake tingkat transfer data (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Nemtokake daya pemancar (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Bukak 1 pipa kanthi pengenal 1 pemancar 0xAABBCCDD11, kanggo nampa data
// Open pipe 2 karo pemancar ID 2xAABBCCDD0 kanggo nampa data
radio.startListening(); // Nguripake panrima, miwiti ngrungokake pipo mbukak
//radio.stopListening();
////////Output informasi layanan
tft.fillScreen(Ireng);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Miwiti initializing kertu SD
Serial.println("Kartu SD Awal");
tft.println("Kartu SD Awal");
tft.setCursor(8, 10);
////////Initializing kertu
yen (!SD.begin(SD_CS_PIN)) {
Serial.println("awal gagal!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Awal gagal!");
bali;
}
tft.setTextColor(PUTIH);
Serial.println("inisialisasi rampung");
tft.println("Inisialisasi rampung");
tundha (2000);
////////Waca wektu lan tanggal lan nemtokake menyang variabel
t = rtc.getTime();
wektu_detik_prev = t.sec;
wektu_dina_prev = t.tanggal;
//////// Meksa metu tanggal supaya ora ngenteni tanggal diganti kanggo tampilan
tft.setCursor(180, 0); // nyetel posisi kursor
tft.fillRect(178, 0, 65, 7, GREY); // ngresiki area output wektu
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Output jeneng obyek kontrol
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
//////// Nggawe file log lan ngasilake asil saka upaya nggawe
tft.setTextSize(1);
tft.setCursor(130, 10); // yen file log 2.txt digawe, banjur nulis menyang file bakal terus
yen (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // yen file 2.txt ora ana, bakal digawe
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop (batal) {
//////// Priksa ana panjalukan kanggo output log menyang monitor port COM
yen (Serial.available() > 0) {
yen (1 == Serial.read());
////////Lan yen "1" ditampa, banjur output
File myFile = SD.open(perv);
// yen file kasedhiya, tulisen:
yen (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
liya {
Serial.println("error opening .txt");
}
}
////////Wacan wacan
t = rtc.getTime();
tft.setTextColor(PUTIH);
////////Yen wayahe wis ganti, banjur tampilake wacan jam anyar
yen (wektu_detik_prev != t.sec) {
tft.setCursor(120, 0); // nyetel posisi kursor
tft.fillRect(118, 0, 50, 7, GREY); // ngresiki area output wektu
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // maca jam output
wektu_detik_prev = t.sec;
}
///////// 4 tanggal wis diganti, banjur nampilake tanggal anyar
yen (wektu_dina_prev != t.tanggal) {
tft.setCursor(180, 0); // nyetel posisi kursor
tft.fillRect(178, 0, 65, 7, GREY); // area tampilan tanggal cetha
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // nampilake maca tanggal
wektu_dina_prev = t.tanggal;
}
//////// Yen panrima radio kasedhiya, banjur
yen (radio.available(&pipe)) {
//////// mriksa manawa buffer nampa kebak,
radio.read(&data, sizeof(data));
////////yen alamat pemancar sing dibutuhake kasedhiya, banjur
if (pipa == 1) {
//////// nunggu urutan sinkronisasi saka nul kanggo nemtokake
// wiwitan pamblokiran data
yen (data == 0000) {
rc = 0;
} Else {
rc++;
}
////////Ngrekam nilai counter lan ngitung ing 10th lan 100ths saben jam
yen (rc == 1) {
leb_1 = data / 3600.0;
}

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

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

yen (rc == 4) {
leb_4 = data / 3600.0;
}
}
}
r++;
k++; // mung counter
//////// Nganyari data kanthi periodisitas tartamtu
yen (r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GREYD);
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 menyang log on SD saben 10 menit.
yen ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Nggawe senar ing format .csv
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + "," + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + "," + (leb_4) + ",";
////////Tulis menyang file lan output asil saka proses nulis
myFile = SD.open(perv, FILE_WRITE); // yen ora ana file sing jenenge "2.txt", bakal digawe.
yen (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, Ijo);
tft.println("SD OK");
Serial.println("SD OK");
tundha (900); // tundha, digunakake ngrekam 13 maca podho rupo nganti detik wis liwati
} Else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Program konversi karakter/* Recode font Rusia saka UTF-8 menyang Windows-1251 */

String utf8rus(String sumber)
{
int i,k;
Target string;
unsigned char n;
char m[2] = { β€˜0’, β€˜ β€˜};

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

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

yen (n >= 0xC0) {
ngalih (n) {
kasus 0xD0: {
n = sumber[i]; i++;
yen (n == 0x81) { n = 0xA8; putus; }
yen (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
mecah;
}
kasus 0xD1: {
n = sumber[i]; i++;
yen (n == 0x91) { n = 0xB8; putus; }
yen (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
mecah;
}
}
}
m[0] = n; target = target + String(m);
}
target bali;
}Program transcoding karakter kanggo output Cyrillic nggunakake perpustakaan Adafruit_GFX diselehake ing folder sing padha karo program utama. Sampeyan uga kudu ngganti file glcdfont.c ing Adafruit_GFX nganggo font sing beda. iku perpustakaan karo panggantos dibutuhake. Informasi liyane babagan Russification bisa gampang ditemokake ing Internet.
Kanggo ngringkes, Aku bakal ngomong sing sistem urip nganti pangarepan, iku wis dadi luwih gampang kanggo ngawasi wektu operasi saka peralatan. Sanajan kabeh wis dipasang ing papan roti, ora ana keluhan langsung babagan karya kasebut. Unsur pisanan wis digunakake luwih saka nem sasi lan wis slamet ing mangsa. Desain paling anyar Wis mlaku kanggo 9 unit sing dikontrol wiwit tanggal 5 Maret lan wektu operasi didaftar kanthi resmi.

Source: www.habr.com

Add a comment