Loka Aŭtonoma Datuma Akirsistemo (daŭrigo)

Komencu sur ĉi tiu retejo ligilo.
La plej oportuna opcio por preni informojn pri ŝaltado de la startigilo montriĝis la opcio kun la optokupilo PC817. Skema diagramoLoka Aŭtonoma Datuma Akirsistemo (daŭrigo)La tabuloj enhavas tri identajn cirkvitojn, ĉio estas metita en ABS plastajn skatolojn, grandeco 100x100 mm. Foto de optokupilojLoka Aŭtonoma Datuma Akirsistemo (daŭrigo) Se ligite al komencaj aparatoj kun duonkonduktaj valvoj, ilia elflua kurento sufiĉas por malfermi la PC817 kaj la nombrilo ekfunkciiĝos malvere. Por ekskludi tian situacion unu pli estas aldonita en serio al la cirkvito de la optokupilo LED kaj la operacio indiko LED. Por fari tion, jumper J1 estas malfermita kaj plia LED LED1 estas lutita enen.
La ricevanta parto estas farita sur flanko 1Loka Aŭtonoma Datuma Akirsistemo (daŭrigo)flanko 2Loka Aŭtonoma Datuma Akirsistemo (daŭrigo)disvolva tabulo konektita al ARDUINO MEGA 2560. Por tio oni uzas duoble-vican konektilon ĉe la fino. Ekrano kun rezolucio de 240x400, havanta rezisteman tuŝekranon kaj temperatursensilon, estas uzata kiel informmontra aparato. HX8352B.Loka Aŭtonoma Datuma Akirsistemo (daŭrigo) Plie, la konektilo al la ICSP sur la ekrantabulo estas forigita kaj la mikro SD-fendo ne estas uzata. La fakto estas, ke la "denaska" SD-ingo ne povas esti uzata pro konflikto sur la SPI-buso. Por la fulmkarto, aparta kartlegilo estis uzita, kiu inkludis 3,3V stabiligilon kaj bufropeceton kun tri produktaĵŝtatoj 74LVS125A. Jen kie la rastilo atendis min. Tri-ŝtata bufro, sed aŭ la E01-ML01DP5 aŭ la kartlegilo funkciis. En la komentoj de la biblioteko, SdFat vidis averton pri nekongruo kun aliaj aparatoj. La niveltransformilo sur la TXS0108E estis forigita kaj anstataŭigita per jumpers, ĉar E01-ML01DP5 estas tolerema al 5V signaloj - ĝi ne helpis. Uzante osciloskopon, signalperdo estis detektita sur la MISO-linio kiam kartlegilo estis ligita. Post zorgema ekzameno, oni trovis, ke la enigoj de la ebligaj signaloj de la OE 4-kanaloj de la 74LVS125A estis simple lutitaj al komuna drato kaj oni ne povis paroli pri iu tria ŝtato. La bufropeceto estis utiligita kiel primitiva niveltransformilo de 5V ĝis 3.3V uzante 3,3 KΩ rezistilojn ligitajn en serio kun la signallinioj. Krom la MISO-linio. Ĝia eliga malsupra ŝaltilo verŝajne altiris signalojn al la grunda nivelo. Determininte, ke la ebliga signalo de la MISO-linio estis pinglo 13, ĝi estis forŝirita de la trako kajlutitaLoka Aŭtonoma Datuma Akirsistemo (daŭrigo)inter la 9LVS74A CS-aparato elektu enigpinglon (125) kaj la finrezistilon. Nun, se ne ekzistas aliro al la memorkarto, la MISO-bufro estas malŝaltita kaj ne malhelpas la funkciadon de alia aparato.Disvolva tabulo-diagramoLoka Aŭtonoma Datuma Akirsistemo (daŭrigo)Ricevilo en funkciadoLoka Aŭtonoma Datuma Akirsistemo (daŭrigo)La DS3231 uzas programaron I2C-buson (TWI) por konekti la horloĝon.
Arduino IDE-Programo// GRAVA: Adafruit_TFTLCD BIBLIOTECA DEVAS ESTI SPECIFIQUE
// Agordita POR ĈU LA TFT-ŜILDO AŬ LA BREAKOUT TABRO.
// VIDU RELEVAJN KOMENTOJN EN Adafruit_TFTLCD.h POR Agordo.
//de Open-Smart Team kaj Catalex Team
//[retpoŝte protektita]
// Store: dx.com
// open-smart.aliexpress.com/store/1199788
//Demonstra Funkcio: Montru grafikojn, signojn
//Arduino IDE: 1.6.5
// Estraro: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#inkluzivi // Kerna grafika biblioteko
//#inkluzivi // Aparataro-specifa biblioteko
#inkluzivi
MCUFRIEND_kbv tft;
#include "SdFat.h" // Uzu la SdFat-bibliotekon
SdFat SD;
SdFile dosiero;
File myFile;
#difini SD_CS_PIN SS

#inkluzivi // Konektu la bibliotekon por labori kun la SPI-buso
#inkluzivi // Konektu la agordan dosieron el la RF24-biblioteko
#inkluzivi // Konektu la bibliotekon por labori kun nRF24L24+
Radio RF24 (47, 49);

#inkluzivi

DS3231 rtc(27, 25);
Tempo t;

uint16_t r = 6000;
uint32_t k = 0;

volatilaj nesubskribitaj longaj datumoj;
flosi leb_1;
flosi leb_2;
flosi leb_3;
flosi leb_4;

uint8_t pipo;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ ****************/ /
// Se vi uzas OPEN-SMART TFT-romptabulo //
// Rekomendas al vi aldoni 5V-3.3V-nivelan konvertan cirkviton.
// Kompreneble vi povas uzi OPEN-SMART UNO Nigran version kun 5V/3.3V elektra ŝaltilo,
// vi nur bezonas ŝanĝi al 3.3V.
// La kontrolpingloj por la LCD povas esti asignitaj al iu ajn cifereca aŭ
// analogaj pingloj...sed ni uzos la analogajn pinglojn kiel tio permesas al ni
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Nigra
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - RESETAJ
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Asignu homlegeblajn nomojn al iuj komunaj 16-bitaj kolorvaloroj:
#difini NIGRAN 0x0000
#difini BLUE 0x001F
#difini RUĜAN 0xF800
#difini VERDA 0x07E0
#difini CYAN 0x07FF
#difini MAGENTA 0xF81F
#difini FLAVAN 0xFFE0
#difini BLANKA 0xFFFF
#difini GRIZON 0x8C51
#difini GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Se vi uzas la ŝildon, ĉiuj kontrolo kaj datumlinioj estas fiksitaj, kaj
// pli simpla deklaro povas laŭvole esti uzata:
// Adafruit_TFTLCD tft;
uint16_t g_identigilo;

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

malplena agordo (malplena) {

rtc.begin();

// Por agordi la tempon, malkomenti la necesajn liniojn
// rtc.setDOW(6); // Tago de la semajno
// rtc.setTime(22, 04, 0); // Tempo, en 24-hora formato.
// rtc.setDate (4, 5, 2019); // Dato, la 29-an de oktobro 2018

Seria.begin (2000000);
//////// Ekrankomencigo
tft.begin(0x65);
tft.restarigi();
tft.setRotation(0);
tft.cp437(vera);
/////////////////Eligo de nomoj, ekipaĵakcesoraĵoj, organizo nomo
tft.fillScreen(NIGRA);
tft.setTextColor (BLANKA);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("PROGRAMAĴOJ & KONSTRUO");
tft.setCursor(30, 20);
tft.print (utf8rus ("Konstruisto V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus ("Turner I.I." ));
malfruo(2000);

radio.begin(); // Komencu laboron nRF24L01+
radio.setChannel(120); // Specifu la datuman ricevkanalon (de 0 ĝis 127)
radio.setDataRate(RF24_250KBPS); // Specifu la transdonon de datumoj (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Specifu la dissendilan potencon (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Malfermu 1 tubon kun la identigilo de 1 dissendilo 0xAABBCCDD11, por ricevi datumojn
// Malfermu tubon 2 kun dissendilo ID 2xAABBCCDD0 por ricevi datumojn
radio.startListening(); // Enŝaltu la ricevilon, komencu aŭskulti malfermitajn pipojn
// radio.stopListening();
////////Eligo de servaj informoj
tft.fillScreen(NIGRA);
tft.setCursor(8, 0);
tft.setTextSize(1);
//////// Komencu pravalorigi la SD-karton
Serial.println("Komenca SD-karto");
tft.println("Komenca SD-karto");
tft.setCursor(8, 10);
////////Inicialigante la karton
se (!SD.begin(SD_CS_PIN)) {
Serial.println ("komenca malsukcesis!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(NIGRA);
tft.println("Komenco malsukcesis!");
reveno;
}
tft.setTextColor (BLANKA);
Serial.println("komencigo farita");
tft.println("Initigo farita");
malfruo(2000);
////////Legante tempon kaj daton kaj atribuante ilin al variabloj
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.dato;
////////Perforte eligu la daton por ne atendi ke la dato ŝanĝiĝos por montriĝo
tft.setCursor(180, 0); // fiksante la pozicion de la kursoro
tft.fillRect(178, 0, 65, 7, GRIZA); // malbaras la tempoproduktan areon
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Eligu la nomon de kontrolobjektoj
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus ("Vinĉoj I"));
////////Kreante protokoldosieron kaj eligante la rezulton de la krea provo
tft.setTextSize(1);
tft.setCursor(130, 10); // se protokoldosiero 2.txt estas kreita, tiam skribo al la dosiero daŭros
se (SD.ekzistas(perv)) {
//tft.setCursor (0, 90);
tft.println(perv);
Seria.println(perv);
} Alie {
miaDosiero = SD.malfermu (perv, DOSIERO_SKRIBA); // se dosiero 2.txt ne ekzistas, ĝi estos kreita
miaDosiero.close();
tft.println(perv);
Seria.println(perv);
}
}

malplena buklo (malplena) {
////////Kontrolante la ekziston de peto por eligi protokolon al la COM-porda monitoro
if (Serial.available() > 0) {
if (1 == Seria.legu());
////////Kaj se "1" estas akceptita, tiam la eligo
Dosiero miaDosiero = SD.open(perv);
// se la dosiero estas disponebla, skribu al ĝi:
se (miaDosiero) {
dum (miaDosiero.disponebla()) {
Serial.write(miaFile.read());
}
miaDosiero.close();
}
alie {
Serial.println ("eraro malfermante .txt");
}
}
////////Legotempo
t = rtc.getTime();
tft.setTextColor (BLANKA);
////////Se la horo ŝanĝiĝis, tiam montru la novajn horloĝojn
if ( tempo_sec_antaŭa != t.sec) {
tft.setCursor(120, 0); // fiksante la pozicion de la kursoro
tft.fillRect(118, 0, 50, 7, GRIZA); // malbaras la tempoproduktan areon
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // eligi horloĝajn legaĵojn
time_sec_prev = t.sec;
}
////////Se la dato ŝanĝiĝis, tiam montru la novan daton
if ( tempo_tago_antaŭa != t.dato) {
tft.setCursor(180, 0); // fiksante la pozicion de la kursoro
tft.fillRect(178, 0, 65, 7, GRIZA); // purigi datan montran areon
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // montras datajn legaĵojn
time_day_prev = t.dato;
}
////////Se disponeblas radioricevo, do
if (radio.disponebla(&pipo)) {
////////kontrolante ĉu la riceva bufro estas plena,
radio.read(&datenoj, sizeof(datenoj));
////////se la bezonata dissendila adreso estas disponebla, do
if (pipo == 1) {
////////atendante sinkronigantan sinsekvon de nuloj por determini
//komenco de la datumbloko
if (datenoj == 0000) {
rc = 0;
} Alie {
rc++;
}
////////Registrante nombrilvalorojn kaj kalkulante ilin en 10-a kaj 100-a horo
se (rc == 1) {
leb_1 = datumoj / 3600.0;
}

se (rc == 2) {
leb_2 = datumoj / 3600.0;
}

se (rc == 3) {
leb_3 = datumoj / 3600.0;
}

se (rc == 4) {
leb_4 = datumoj / 3600.0;
}
}
}
r++;
k++; // nur nombrilo
//////// Datumoj ĝisdatigas kun certa periodeco
se ( 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);
Seria.println(k);
r = 0;
}
////////Skribu datumojn al la protokolo sur SD ĉiujn 10 minutojn.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(NIGRA);
////////Kreante ĉenon en .csv-formato
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Skribu al dosiero kaj eligu la rezultojn de la skribprocezo
miaDosiero = SD.malfermu (perv, DOSIERO_SKRIBA); // se ne ekzistas dosiero nomita "2.txt", ĝi estos kreita.
se (miaDosiero) {
miaDosiero.println(dataString);
miaDosiero.close();
tft.fillRect(198, 8, 42, 10, VERDA);
tft.println ("SD OK");
Serial.println ("SD OK");
malfruo (900); // prokrasto, alie registras 13 identajn legaĵojn ĝis sekundo pasis
} Alie {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD-ERARO");
Serial.println ("SD ERR");
}
}
}Programo de konvertiĝo de karakteroj/* Rekodu rusajn tiparojn de UTF-8 al Windows-1251 */

String utf8rus(String fonto)
{
int i,k;
String celo;
unsigned char n;
char m[2] = { '0', ' ' };

k = fonto.longo(); i = 0;

dum (i < k) {
n = fonto[i]; i++;

se (n >= 0xC0) {
ŝaltilo (n) {
kazo 0xD0: {
n = fonto[i]; i++;
if (n == 0x81) { n = 0xA8; rompi; }
se (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
rompi;
}
kazo 0xD1: {
n = fonto[i]; i++;
if (n == 0x91) { n = 0xB8; rompi; }
se (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
rompi;
}
}
}
m[0] = n; celo = celo + Ŝnuro (m);
}
reveno celo;
}La programo de transkodigo de signoj por cirila eligo uzante la bibliotekon Adafruit_GFX estas metita en la saman dosierujon kun la ĉefa programo. Vi ankaŭ devas anstataŭigi la dosieron glcdfont.c en Adafruit_GFX per malsama tiparo. estas biblioteko kun la postulata anstataŭaĵo. Pliaj informoj pri Rusigo troveblas facile en la Interreto.
Por resumi, mi diros, ke la sistemo plenumis la atendojn, fariĝis pli facile kontroli la funkcian tempon de la ekipaĵo. Kvankam ĉio estas kunvenita sur pantabuloj, ne estas tujaj plendoj pri la laboro. La unuaj elementoj funkcias pli ol ses monatojn kaj travivis la vintron. Plej nova dezajno Ĝi funkcias por 9 kontrolitaj unuoj ekde la 5-a de marto kaj la funkciada tempo estas oficiale registrita uzante ĝin.

fonto: www.habr.com

Aldoni komenton