Tokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena)

Hasi gune honetan по ссылке.
Abiarazlea pizteari buruzko informazioa berreskuratzeko aukerarik erosoena PC817 optoakoplagailuaren aukera izan zen. Diagrama eskematikoaTokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena)Plakek hiru zirkuitu berdin dituzte, dena ABS plastikozko kaxetan dago, 100x100 mm-ko tamainan. Optoakoplagailuen argazkiaTokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena) Balbula erdieroaleak dituzten abiarazte gailuetara konektatzean, haien ihes-korrontea nahikoa da PC817 irekitzeko eta kontagailua faltsuki piztuko da. Egoera hori baztertzeko beste bat gehitzen zaio seriean optoakoplagailuaren LEDaren eta funtzionamenduaren adierazlearen LEDaren zirkuituan. Horretarako, J1 jumpera ireki eta LED LED1 osagarri bat soldatzen da.
Parte hartzailea on eginda dago Aldea 1Tokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena)Aldea 2Tokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena)garapen-plaka ARDUINO MEGA 2560-ra konektatuta. Horretarako, ilara bikoitzeko konektorea erabiltzen da amaieran. 240x400 bereizmeneko pantaila bat, ukipen-pantaila erresistentea eta tenperatura sentsore bat dituena, informazioa bistaratzeko gailu gisa erabiltzen da. HX8352B.Tokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena) Gainera, pantaila-plakako ICSP-rako konektorea kendu egiten da eta mikro SD zirrikitua ez da erabiltzen. Kontua da SD socket "jatorrizkoa" ezin dela erabili SPI buseko gatazka bat dela eta. Flash-txartelerako, aparteko txartel-irakurle bat erabili zen, 3,3V-ko egonkortzaile bat eta 74LVS125A hiru irteera-egoera dituen buffer-txipa barne. Hortxe zegoen nire zain arrastoa. Hiru egoerako buffer bat, baina E01-ML01DP5 edo txartel irakurgailuak funtzionatu zuen. Liburutegiko iruzkinetan, SdFat-ek beste gailu batzuekiko bateraezintasunari buruzko abisua ikusi zuen. TXS0108E-ko maila-bihurgailua kendu eta jumperekin ordezkatu zen, zeren E01-ML01DP5 5V-ko seinaleekiko tolerantzia da - ez zuen lagundu. Osziloskopio bat erabiliz, seinale-galera bat detektatu zen MISO linean txartel irakurgailua konektatzean. Arretaz aztertu ondoren, 4LVS74A-ko OE 125 kanalen gaitze-seinaleen sarrerak hari komun batera soldatzen zirela eta ezin zen hirugarren egoeraz hitz egin. Buffer txipa 5V-tik 3.3V-ra arteko maila primitibo gisa erabili zen, seinale-lerroekin seriean konektatuta dauden 3,3 KΩ-ko erresistentziak erabiliz. MISO linea izan ezik. Bere irteerako beheko etengailuak seguruenik seinaleak erakarri zituen lur mailara. MISO linearen gaitze-seinalea 13. pina zela zehaztuta, pistatik kendu zuten etasoldatuaTokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena)9LVS74A CS gailuaren artean hautatu sarrerako pin (125) eta amaierako erresistentzia. Orain, memoria-txartelerako sarbiderik ez badago, MISO buffer-a desgaituta dago eta ez du beste gailu baten funtzionamendua oztopatzen.Garapen taularen diagramaTokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena)Hargailua martxanTokiko Datuak Eskuratzeko Sistema Autonomoa (jarraipena)DS3231-k software I2C bus (TWI) erabiltzen du erlojua konektatzeko.
Arduino IDE programa// GARRANTZITSUA: Adafruit_TFTLCD LIBURUTEGIA BEREZIA IZAN BEHAR DA
// TFT SHIELD EDO BREAKOUT TAULAKO KONFIGURATUA.
// IKUSI IRUZKINAK GARRANTZITSUAK Adafruit_TFTLCD.h-n KONFIGURATZEKO.
//Open-Smart Team eta Catalex Team-en eskutik
//[posta elektroniko bidez babestua]
//Denda: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo funtzioa: bistaratu grafikoak, karaktereak
//Arduino IDE: 1.6.5
// Plaka: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#sartu // Oinarrizko liburutegi grafikoa
//#sartu // Hardwareari dagokion liburutegia
#sartu
MCUFRIEND_kbv tft;
#include "SdFat.h" // Erabili SdFat liburutegia
SdFat SD;
SdFile fitxategia;
Artxibatu myFile;
#defini SD_CS_PIN SS

#sartu // Konektatu liburutegia SPI busarekin lan egiteko
#sartu // Konektatu ezarpenen fitxategia RF24 liburutegitik
#sartu // Konektatu liburutegia nRF24L24+-rekin lan egiteko
RF24 irratia (47, 49);

#sartu

DS3231 rtc(27, 25);
Denbora t;

uint16_t r = 6000;
uint32_t k = 0;

sinatu gabeko datu luze lurrunkorrak;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

uint8_t kanalizazioa;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ ****************/ /
// OPEN-SMART TFT breakout taula erabiltzen baduzu //
// 5V-3.3V maila bihurtzeko zirkuitua gehitzea gomendatzen dizu.
// Jakina, OPEN-SMART UNO Black bertsioa erabil dezakezu 5V/3.3V etengailuarekin,
// 3.3V-ra aldatu besterik ez duzu behar.
// LCDaren kontrol-pinak edozein digital edo digitalari esleitu daitezke
// pin analogikoak...baina pin analogikoak erabiliko ditugu honek ahalbidetzen digun heinean
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Beltza
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - Berrezarri
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Esleitu gizakiek irakur daitezkeen izenak 16 biteko kolore-balio arrunt batzuei:
#defini BELTZA 0x0000
#defini 0x001F URDINA
#defini RED 0xF800
#defini BERDEA 0x07E0
#define CYAN 0x07FF
#definitu MAGENTA 0xF81F
#defini HORIA 0xFFE0
#defini WHITE 0xFFFF
#defini GRISA 0x8C51
#definitzen GREYD 0x39E7

//Adafruit_TFTLCD tft (LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Ezkutua erabiliz gero, kontrol- eta datu-lerro guztiak finkoak dira, eta
// deklarazio sinpleago bat erabil daiteke aukeran:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

ezarpen konfigurazioa (hutsa) {

rtc.begin();

// Ordua ezartzeko, kendu komentarioak beharrezko lerroak
// rtc.setDOW(6); // Asteko eguna
// rtc.setTime(22, 04, 0); // Ordua, 24 orduko formatuan.
// rtc.setDate(4, 5, 2019); // Eguna, 29ko urriaren 2018a

Serial.begin (2000000);
//////// Pantaila hasieratzea
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(egia);
//////////////////Izenen irteera, ekipoen osagarriak, erakundearen izena
tft.fillScreen(BELTZA);
tft.setTextColor(ZURIA);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("GARATZAILEAK ETA ERAIKITZEN");
tft.setCursor(30, 20);
tft.print (utf8rus ("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus ("Turner I.I." ));
atzerapena(2000);

irratia.hasi(); // Lanari ekin nRF24L01+
radio.setChannel(120); // Zehaztu datuak jasotzeko kanala (0tik 127ra)
radio.setDataRate(RF24_250KBPS); // Zehaztu datuen transferentzia-tasa (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Zehaztu transmisorearen potentzia (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Ireki hodi bat 1xAABBCCDD1 transmisore 0 identifikatzailearekin, datuak jasotzeko
// Ireki 2 hodia 2xAABBCCDD0 igorle IDarekin datuak jasotzeko
irratia.hasiEntzuten(); // Hargailua piztu, hodi irekiak entzuten hasi
// irratia.stopListening();
////////Zerbitzuaren informazioaren irteera
tft.fillScreen(BELTZA);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Hasi SD txartela hasieratzen
Serial.println("Hasierako SD txartela");
tft.println("Hasierako SD txartela");
tft.setCursor(8, 10);
////////Txartela hasieratzen
bada (!SD.begin(SD_CS_PIN)) {
Serial.println("hasierako huts egin du!");
tft.fillRect(8, 10, 85, 7, GORRIA);
tft.setTextColor(BLACK);
tft.println("Hasierako huts egin du!");
itzultzeko;
}
tft.setTextColor(ZURIA);
Serial.println("hasieratze egina");
tft.println("Hasieratze egina");
atzerapena(2000);
////////Ordua eta data irakurtzea eta aldagaiei esleitzea
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.data;
////////Data indarrez atera, data aldatzeko itxaron ez dadin bistaratzeko
tft.setCursor(180, 0); // kurtsorearen posizioa ezartzen
tft.fillRect(178, 0, 65, 7, GRISA); // denbora irteera eremua garbitzen
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Irteera kontrol-objektuen izena
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus ("Winches I"));
////////Erregistro-fitxategi bat sortzea eta sortzeko saiakeraren emaitza ateratzea
tft.setTextSize(1);
tft.setCursor(130, 10); // 2.txt erregistro-fitxategia sortzen bada, fitxategian idazten jarraituko da
bada (SD.exists(perv)) {
//tft.setCursor (0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // 2.txt fitxategia existitzen ez bada, sortuko da
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

hutsune begizta (hutsa) {
////////COM ataka monitoreari erregistro bat ateratzeko eskaeraren existentzia egiaztatzea
bada (Serial.available() > 0) {
if (1 == Serial.read());
////////Eta “1” onartzen bada, orduan irteera
Fitxategia myFile = SD.open(perv);
// fitxategia eskuragarri badago, idatzi bertan:
bada (nireFitxategia) {
bitartean (nireFitxategia.erabilgarri()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println ("errorea .txt irekitzean");
}
}
////////Irakurketa denbora
t = rtc.getTime();
tft.setTextColor(ZURIA);
////////Ordua aldatu bada, bistaratu erlojuaren irakurketa berriak
if (denbora_seg_aurreko != t.sec) {
tft.setCursor(120, 0); // kurtsorearen posizioa ezartzen
tft.fillRect(118, 0, 50, 7, GRISA); // denbora irteera eremua garbitzen
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // erlojuaren irakurketak atera
time_sec_prev = t.sec;
}
////////Data aldatu bada, bistaratu data berria
if ( ordua_eguna_aurreko != t.data) {
tft.setCursor(180, 0); // kurtsorearen posizioa ezartzen
tft.fillRect(178, 0, 65, 7, GRISA); // garbitu data bistaratzeko eremua
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // dataren irakurketak bistaratu
time_day_prev = t.data;
}
////////Irrati-harrera eskuragarri badago, orduan
bada (irratia.erabilgarri(&pipe)) {
////////jasotzeko buffer-a beteta dagoen egiaztatzea,
radio.read(&data, sizeof(data));
//////// beharrezkoa den igorlearen helbidea eskuragarri badago, orduan
bada (tutua == 1) {
////////zeroen sekuentzia sinkronizatzailea zehazteko zain gaude
//datu blokearen hasiera
bada (datuak == 0000) {
rc = 0;
} Else {
rc++;
}
////////Kontagailuaren balioak erregistratzea eta orduko 10. eta 100.etan kalkulatzea
bada (rc == 1) {
leb_1 = datuak / 3600.0;
}

bada (rc == 2) {
leb_2 = datuak / 3600.0;
}

bada (rc == 3) {
leb_3 = datuak / 3600.0;
}

bada (rc == 4) {
leb_4 = datuak / 3600.0;
}
}
}
r++;
k++; // kontagailu bat besterik ez
//////// Datuak eguneratzea aldizkakotasun jakin batekin
bada ( 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;
}
////////Idatzi datuak SD erregistroan 10 minutuz behin.
bada ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////.csv formatuan kate bat sortzea
String dataString = Katea (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Idatzi fitxategi batean eta atera idazketa-prozesuaren emaitzak
myFile = SD.open(perv, FILE_WRITE); // "2.txt" izeneko fitxategirik ez badago, sortuko da.
bada (nireFitxategia) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, BERDEA);
tft.println ("SD OK");
Serial.println ("SD OK");
atzerapena(900); // atzeratu, bestela 13 irakurketa berdin erregistratzen ditu segundo bat igaro arte
} Else {
tft.fillRect(198, 8, 42, 10, GORRIA);
tft.println ("SD ERR");
Serial.println ("SD ERR");
}
}
}Karaktereak bihurtzeko programa/* Errusiako letra-tipoak birkodetu UTF-8tik Windows-1251era */

String utf8rus(String iturria)
{
int i,k;
Katearen helburua;
sinatu gabeko char n;
char m[2] = { '0', ' ' };

k = iturria.luzera(); i = 0;

bitartean (i < k) {
n = iturria[i]; i++;

bada (n >= 0xC0) {
etengailua (n) {
kasua 0xD0: {
n = iturria[i]; i++;
bada (n == 0x81) { n = 0xA8; hautsi; }
bada (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
apurtu;
}
kasua 0xD1: {
n = iturria[i]; i++;
bada (n == 0x91) { n = 0xB8; hautsi; }
bada (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
apurtu;
}
}
}
m[0] = n; xede = xede + String(m);
}
itzulera helburua;
}Adafruit_GFX liburutegia erabiliz ziriliko irteerarako karaktereak transkodetzeko programa programa nagusiaren karpeta berean jartzen da. Gainera, Adafruit_GFX-ko glcdfont.c fitxategia letra-tipo ezberdin batekin ordeztu behar duzu. Hemen behar den ordezkoa duen liburutegia. Errusifikazioari buruzko informazio gehiago Interneten erraz aurki daiteke.
Laburbilduz, sistemak aurreikuspenak bete dituela esango dut, ekipamenduaren funtzionamendu-denbora kontrolatzea errazagoa bihurtu dela. Dena oholetan muntatuta dagoen arren, ez dago berehalako kexarik lanari buruz. Lehen elementuek sei hilabete baino gehiago daramatzate lanean eta neguari eutsi diote. Azken diseinua Martxoaren 9az geroztik kontrolatutako 5 unitatetan dago martxan eta funtzionamendu-denbora ofizialki erregistratzen ari da hura erabiliz.

Iturria: www.habr.com

Gehitu iruzkin berria