Lokal na Autonomous Data Acquisition System (ipinagpatuloy)

Magsimula sa site na ito ΠΏΠΎ ссылкС.
Ang pinaka-maginhawang opsyon para sa pagkuha ng impormasyon tungkol sa pag-on sa starter ay naging opsyon sa PC817 optocoupler. Diagram ng circuitLokal na Autonomous Data Acquisition System (ipinagpatuloy)Ang mga board ay naglalaman ng tatlong magkaparehong mga circuit, lahat ay inilalagay sa mga plastik na kahon ng ABS, laki na 100x100 mm. Larawan ng mga optocouplerLokal na Autonomous Data Acquisition System (ipinagpatuloy) Kapag nakakonekta sa mga panimulang device na may mga balbula ng semiconductor, sapat na ang leakage current ng mga ito upang buksan ang PC817 at mali-trigger ang counter. Upang ibukod ang ganitong sitwasyon isa pa ay idinagdag sa serye sa circuit ng optocoupler LED at ang operation indication LED. Upang gawin ito, ang jumper J1 ay binuksan at isang karagdagang LED LED1 ay ibinebenta.
Ang bahagi ng pagtanggap ay ginawa sa panig 1Lokal na Autonomous Data Acquisition System (ipinagpatuloy)panig 2Lokal na Autonomous Data Acquisition System (ipinagpatuloy)development board na konektado sa ARDUINO MEGA 2560. Para dito, ginagamit ang double-row connector sa dulo. Ang screen na may resolution na 240x400, na mayroong resistive touchscreen at temperature sensor, ay ginagamit bilang isang information display device. HX8352B.Lokal na Autonomous Data Acquisition System (ipinagpatuloy) Bukod dito, ang connector sa ICSP sa screen board ay tinanggal at ang micro SD slot ay hindi ginagamit. Ang katotohanan ay ang "katutubong" SD socket ay hindi magagamit dahil sa isang salungatan sa SPI bus. Para sa flash card, gumamit ng hiwalay na card reader, na may kasamang 3,3V stabilizer at buffer chip na may tatlong output states na 74LVS125A. Dito naghihintay sa akin ang kalaykay. Isang three-state buffer, ngunit gumana ang alinman sa E01-ML01DP5 o ang card reader. Sa mga komento sa library, nakakita ang SdFat ng babala tungkol sa hindi pagkakatugma sa iba pang mga device. Ang level converter sa TXS0108E ay inalis at pinalitan ng mga jumper, dahil Ang E01-ML01DP5 ay mapagparaya sa 5V signal - hindi ito nakatulong. Gamit ang isang oscilloscope, natukoy ang pagkawala ng signal sa linya ng MISO kapag nakakonekta ang isang card reader. Sa maingat na pagsusuri, napag-alaman na ang mga input ng mga nagpapagana na signal ng OE 4 na channel ng 74LVS125A ay na-solder lang sa isang karaniwang wire at hindi maaaring pag-usapan ang anumang ikatlong estado. Ang buffer chip ay ginamit bilang isang primitive level converter mula 5V hanggang 3.3V gamit ang 3,3 KΞ© resistors na konektado sa serye sa mga linya ng signal. Maliban sa linya ng MISO. Ang output bottom switch nito ay malamang na umakit ng mga signal sa ground level. Nang matukoy na ang enable signal ng linya ng MISO ay pin 13, natanggal ito mula sa track atnaghinangLokal na Autonomous Data Acquisition System (ipinagpatuloy)sa pagitan ng 9LVS74A CS device piliin ang input pin (125) at ang termination resistor. Ngayon, kung walang access sa memory card, ang MISO buffer ay hindi pinagana at hindi nakakasagabal sa pagpapatakbo ng isa pang device.Diagram ng development boardLokal na Autonomous Data Acquisition System (ipinagpatuloy)Receiver sa operasyonLokal na Autonomous Data Acquisition System (ipinagpatuloy)Gumagamit ang DS3231 ng software na I2C bus (TWI) para ikonekta ang orasan.
Arduino IDE Program// MAHALAGA: DAPAT NA SPECIFICALLY ANG Adafruit_TFTLCD LIBRARY
// CONFIGURED PARA SA TFT SHIELD O SA BREAKOUT BOARD.
// TINGNAN ANG MGA KAUGNAY NA KOMENTO SA Adafruit_TFTLCD.h PARA SA SETUP.
//ng Open-Smart Team at Catalex Team
//[protektado ng email]
//Tindahan: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo Function: Ipakita ang mga graphics, mga character
//Arduino IDE: 1.6.5
// Lupon: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Board:OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2INCH 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

#isama // Core graphics library
//#include // library na partikular sa hardware
#isama
MCUFRIEND_kbv tft;
#include "SdFat.h" // Gamitin ang SdFat library
SdFat SD;
SdFile file;
I-file ang myFile;
#define SD_CS_PIN SS

#isama // Ikonekta ang library upang gumana sa SPI bus
#isama // Ikonekta ang file ng mga setting mula sa RF24 library
#isama // Ikonekta ang library upang gumana sa nRF24L24+
RF24 radio(47, 49);

#isama

DS3231 rtc(27, 25);
Oras t;

uint16_t r = 6000;
uint32_t k = 0;

pabagu-bago ng isip unsigned mahabang data;
lumutang leb_1;
lumutang leb_2;
lumutang leb_3;
lumutang leb_4;

uint8_t pipe;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ *****************/ /
// Kung gumagamit ka ng OPEN-SMART TFT breakout board //
// Inirerekomenda mong magdagdag ng 5V-3.3V level converting circuit.
// Siyempre maaari mong gamitin ang OPEN-SMART UNO Black na bersyon na may 5V/3.3V power switch,
// kailangan mo lang lumipat sa 3.3V.
// Ang mga control pin para sa LCD ay maaaring italaga sa anumang digital o
// analog pins...ngunit gagamitin namin ang analog pins dahil pinapayagan kami nito
//β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - I-RESET
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Magtalaga ng mga pangalan na nababasa ng tao sa ilang karaniwang 16-bit na halaga ng kulay:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define DILAW 0xFFE0
#define WHITE 0xFFFF
#define GREY 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Kung ginagamit ang kalasag, ang lahat ng kontrol at mga linya ng data ay naayos, at
// ang isang mas simpleng deklarasyon ay maaaring opsyonal na gamitin:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

walang bisa ang pag-setup (walang bisa) {

rtc.begin();

// Para itakda ang oras, alisin sa komento ang mga kinakailangang linya
// rtc.setDOW(6); // Araw
// rtc.setTime(22, 04, 0); // Oras, sa 24 na oras na format.
// rtc.setDate(4, 5, 2019); // Petsa, Oktubre 29, 2018

Serial.begin (2000000);
//////// Pagsisimula ng screen
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(totoo);
/////////////////Output ng mga pangalan, accessories ng kagamitan, pangalan ng organisasyon
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("MGA DEVELOPERS & BUILD");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
pagkaantala (2000);

radio.begin(); // Simulan ang trabaho nRF24L01+
radio.setChannel(120); // Tukuyin ang channel ng pagtanggap ng data (mula 0 hanggang 127)
radio.setDataRate(RF24_250KBPS); // Tukuyin ang rate ng paglilipat ng data (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Tukuyin ang kapangyarihan ng transmitter (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Buksan ang 1 pipe na may identifier ng 1 transmitter 0xAABBCCDD11, para makatanggap ng data
// Buksan ang pipe 2 na may transmitter ID 2xAABBCCDD0 para makatanggap ng data
radio.startListening(); // I-on ang receiver, simulan ang pakikinig sa mga bukas na tubo
// radio.stopListening();
////////Output ng impormasyon ng serbisyo
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Simulan ang pagsisimula ng SD card
Serial.println("Initial SD card");
tft.println("Paunang SD card");
tft.setCursor(8, 10);
////////Initialize ang card
kung (!SD.begin(SD_CS_PIN)) {
Serial.println("nabigo ang inisyal!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Nabigo ang inisyal!");
bumalik;
}
tft.setTextColor(WHITE);
Serial.println("initialization done");
tft.println("Tapos na ang pagsisimula");
pagkaantala (2000);
////////Pagbasa ng oras at petsa at pagtatalaga ng mga ito sa mga variable
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.petsa;
////////Sapilitang i-output ang petsa upang hindi hintayin na magbago ang petsa para ipakita
tft.setCursor(180, 0); // pagtatakda ng posisyon ng cursor
tft.fillRect(178, 0, 65, 7, GREY); // nililinis ang lugar ng output ng oras
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////I-output ang pangalan ng mga control object
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
////////Paggawa ng log file at paglabas ng resulta ng pagtatangka sa paglikha
tft.setTextSize(1);
tft.setCursor(130, 10); // kung ginawa ang log file 2.txt, magpapatuloy ang pagsulat sa file
kung (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Iba pa {
myFile = SD.open(perv, FILE_WRITE); // kung ang file 2.txt ay hindi umiiral, ito ay malilikha
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop (walang bisa) {
////////Pagsusuri sa pagkakaroon ng kahilingan na mag-output ng log sa monitor ng COM port
kung (Serial.available() > 0) {
kung (1 == Serial.read());
///////At kung tinanggap ang "1", pagkatapos ay ang output
File myFile = SD.open(perv);
// kung available ang file, sumulat dito:
kung (myFile) {
habang (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
tao {
Serial.println("error opening .txt");
}
}
////////Tagal ng pagbabasa
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Kung nagbago ang oras, pagkatapos ay ipakita ang mga bagong pagbabasa ng orasan
kung ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // pagtatakda ng posisyon ng cursor
tft.fillRect(118, 0, 50, 7, GREY); // nililinis ang lugar ng output ng oras
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // output clock readings
time_sec_prev = t.sec;
}
////////Kung nagbago ang petsa, pagkatapos ay ipakita ang bagong petsa
kung ( time_day_prev != t.date) {
tft.setCursor(180, 0); // pagtatakda ng posisyon ng cursor
tft.fillRect(178, 0, 65, 7, GREY); // clear date display area
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // ipakita ang mga pagbabasa ng petsa
time_day_prev = t.petsa;
}
////////Kung available ang radio reception, kung gayon
kung (radio.available(&pipe)) {
////////pagsusuri kung puno na ang receive buffer,
radio.read(&data, sizeof(data));
////////kung available ang kinakailangang address ng transmitter, kung gayon
kung (pipe == 1) {
////////naghihintay para sa isang synchronizing sequence ng mga zero upang matukoy
//simula ng data block
kung (data == 0000) {
rc = 0;
} Iba pa {
rc++;
}
////////Pagre-record ng mga halaga ng counter at pagkalkula ng mga ito sa ika-10 at ika-100 ng isang oras
kung (rc == 1) {
leb_1 = data / 3600.0;
}

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

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

kung (rc == 4) {
leb_4 = data / 3600.0;
}
}
}
r++;
k++; // counter lang
//////// Pag-update ng data na may tiyak na periodicity
kung ( 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;
}
////////Isulat ang data sa log on SD tuwing 10 minuto.
kung ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Paggawa ng string sa .csv na format
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ "," + (leb_3) + "," + (leb_4) + ",";
////////Sumulat sa isang file at ilabas ang mga resulta ng proseso ng pagsulat
myFile = SD.open(perv, FILE_WRITE); // kung walang file na may pangalang "2.txt", ito ay gagawin.
kung (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, BERDE);
tft.println("SD OK");
Serial.println("SD OK");
pagkaantala(900); // pagkaantala, kung hindi man ay nagtatala ng 13 magkaparehong pagbabasa hanggang lumipas ang isang segundo
} Iba pa {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Programa ng conversion ng character/* I-recode ang mga Russian font mula sa UTF-8 hanggang Windows-1251 */

String utf8rus(String source)
{
int i,k;
Target ng string;
unsigned char n;
char m[2] = { '0', ' ' };

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

habang (i < k) {
n = pinagmulan[i]; i++;

kung (n >= 0xC0) {
lumipat (n) {
kaso 0xD0: {
n = pinagmulan[i]; i++;
kung (n == 0x81) { n = 0xA8; pahinga; }
kung (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
masira;
}
kaso 0xD1: {
n = pinagmulan[i]; i++;
kung (n == 0x91) { n = 0xB8; pahinga; }
kung (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
masira;
}
}
}
m[0] = n; target = target + String(m);
}
balik target;
}Ang character transcoding program para sa Cyrillic output gamit ang Adafruit_GFX library ay inilalagay sa parehong folder na may pangunahing program. Kailangan mo ring palitan ang glcdfont.c file sa Adafruit_GFX ng ibang font. Dito library na may kinakailangang kapalit. Higit pang impormasyon tungkol sa Russification ay madaling mahanap sa Internet.
Upang ibuod, sasabihin ko na ang sistema ay nabuhay hanggang sa mga inaasahan, naging mas madali ang pagsubaybay sa oras ng pagpapatakbo ng kagamitan. Kahit na ang lahat ay naka-assemble sa mga breadboard, walang mga agarang reklamo tungkol sa trabaho. Ang mga unang elemento ay gumagana nang higit sa anim na buwan at nakaligtas sa taglamig. Pinakabagong disenyo Ito ay tumatakbo para sa 9 na kinokontrol na mga yunit mula noong Marso 5 at ang oras ng pagpapatakbo ay opisyal na nakarehistro gamit ito.

Pinagmulan: www.habr.com

Magdagdag ng komento