Hasi gune honetan
Abiarazlea pizteari buruzko informazioa berreskuratzeko aukerarik erosoena PC817 optoakoplagailuaren aukera izan zen. Diagrama eskematikoaPlakek hiru zirkuitu berdin dituzte, dena ABS plastikozko kaxetan dago, 100x100 mm-ko tamainan. Optoakoplagailuen argazkia Balbula erdieroaleak dituzten abiarazte gailuetara konektatzean, haien ihes-korrontea nahikoa da PC817 irekitzeko eta kontagailua faltsuki piztuko da. Egoera hori baztertzeko
Parte hartzailea on eginda dago Aldea 1Aldea 2garapen-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. 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 etasoldatua9LVS74A 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 diagramaHargailua martxanDS3231-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:
//
//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:
//
//OPEN-SMART UNO R3 5V / 3.3V:
//
#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.
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.
Iturria: www.habr.com