SÄciet Å”ajÄ vietnÄ
ÄrtÄkÄ iespÄja izgÅ«t informÄciju par startera ieslÄgÅ”anu izrÄdÄ«jÄs opcija ar PC817 optronu. Shematiska diagrammaPlÄtnÄs ir trÄ«s identiskas shÄmas, viss ievietots ABS plastmasas kastÄs, izmÄrs 100x100 mm. FotoattÄls no optroniem Ja tas ir savienots ar palaiÅ”anas ierÄ«cÄm ar pusvadÄ«tÄju vÄrstiem, to noplÅ«des strÄva ir pietiekama, lai atvÄrtu PC817, un skaitÄ«tÄjs iedarbinÄsies kļūdaini. Lai izslÄgtu Å”Ädu situÄciju
SaÅemoÅ”Ä daļa ir izgatavota uz 1. puse2. puseizstrÄdes plate savienota ar ARDUINO MEGA 2560. Å im nolÅ«kam tiek izmantots divrindu savienotÄjs galÄ. KÄ informÄcijas displeja ierÄ«ce tiek izmantots ekrÄns ar izŔķirtspÄju 240x400 ar rezistÄ«vu skÄrienekrÄnu un temperatÅ«ras sensoru. HX8352B. TurklÄt ekrÄna plates savienotÄjs ar ICSP ir noÅemts un micro SD slots netiek izmantots. Fakts ir tÄds, ka āvietÄjoā SD ligzdu nevar izmantot SPI kopnes konflikta dÄļ. Flash kartei tika izmantots atseviŔķs karÅ”u lasÄ«tÄjs, kas ietvÄra 3,3V stabilizatoru un bufera mikroshÄmu ar trim izejas stÄvokļiem 74LVS125A. Å eit mani gaidÄ«ja grÄbeklis. TrÄ«s stÄvokļu buferis, taÄu strÄdÄja vai nu E01-ML01DP5, vai karÅ”u lasÄ«tÄjs. BibliotÄkas komentÄros SdFat redzÄja brÄ«dinÄjumu par nesaderÄ«bu ar citÄm ierÄ«cÄm. TXS0108E lÄ«meÅa pÄrveidotÄjs tika noÅemts un aizstÄts ar džemperiem, jo E01-ML01DP5 ir izturÄ«gs pret 5V signÄliem - tas nepalÄ«dzÄja. Izmantojot osciloskopu, tika konstatÄts signÄla zudums MISO lÄ«nijÄ, kad tika pievienots karÅ”u lasÄ«tÄjs. RÅ«pÄ«gi pÄrbaudot, tika konstatÄts, ka 4LVS74A OE 125 kanÄlu ieslÄdzoÅ”o signÄlu ieejas ir vienkÄrÅ”i pielodÄtas pie kopÄjÄ vada un par kÄdu treÅ”o stÄvokli nevarÄja bÅ«t ne runas. Bufera mikroshÄma tika izmantota kÄ primitÄ«vs lÄ«meÅa pÄrveidotÄjs no 5V lÄ«dz 3.3V, izmantojot 3,3 KĪ© rezistorus, kas savienoti virknÄ ar signÄla lÄ«nijÄm. IzÅemot MISO lÄ«niju. TÄs izejas apakÅ”Äjais slÄdzis, iespÄjams, piesaistÄ«ja signÄlus zemes lÄ«menÄ«. KonstatÄjot, ka MISO lÄ«nijas ieslÄgÅ”anas signÄls ir 13. tapa, tÄ tika norauta no trases unpielodÄtsstarp 9LVS74A CS ierÄ«ci izvÄlieties ievades tapu (125) un beigu rezistoru. Tagad, ja nav piekļuves atmiÅas kartei, MISO buferis ir atspÄjots un netraucÄ citas ierÄ«ces darbÄ«bu.AttÄ«stÄ«bas dÄļa diagrammaUztvÄrÄjs darbojasDS3231 izmanto programmatÅ«ras I2C kopni (TWI), lai savienotu pulksteni.
Arduino IDE programma// SVARÄŖGI: Adafruit_TFTLCD BIBLIOTÄKAI JÄBÅŖT KONKRÄTI
// KONFIGURÄTS TFT VAIROGAM VAI IZLAUKÅ ANAS PLÄLEI.
// SKATÄŖT ATTIECÄŖGOS KOMENTÄRUS Adafruit_TFTLCD.h LAI IESTATÄŖT.
//no Open-Smart Team un Catalex Team
//[e-pasts aizsargÄts]
//Veikals:
//
//DemonstrÄcijas funkcija: displeja grafika, rakstzÄ«mes
//Arduino IDE: 1.6.5
// Valde: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo
// Valde: OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2 INCH TFT:
//
//OPEN-SMART UNO R3 5V / 3.3V:
//
#iekļauts // Grafikas galvenÄ bibliotÄka
//#iekļauts // AparatÅ«rai raksturÄ«ga bibliotÄka
#iekļauts
MCUFRIEND_kbv tft;
#include "SdFat.h" // Izmantojiet SdFat bibliotÄku
SdFat SD;
SdFile fails;
Fails myFile;
#define SD_CS_PIN SS
#iekļauts // Savienojiet bibliotÄku darbam ar SPI kopni
#iekļauts // Pievienojiet iestatÄ«jumu failu no RF24 bibliotÄkas
#iekļauts // Pievienojiet bibliotÄku darbam ar nRF24L24+
RF24 radio (47, 49);
#iekļauts
DS3231 rtc(27, 25);
Laiks t;
uint16_t r = 6000;
uint32_t k = 0;
gaistoŔi neparakstīti garie dati;
pludiÅÅ” leb_1;
pludiÅÅ” leb_2;
pludiÅÅ” leb_3;
pludiÅÅ” leb_4;
uint8_t caurule;
int rc = 0;
uint8_t time_sec_prev;
uint8_t time_day_prev;
//**************************************************** ****************/ /
// Ja izmantojat OPEN-SMART TFT sadalīŔanas paneli //
// IesakÄm pievienot 5V-3.3V lÄ«meÅa konvertÄÅ”anas Ä·Ädi.
// Protams, var izmantot OPEN-SMART UNO Black versiju ar 5V/3.3V strÄvas slÄdzi,
// jums vienkÄrÅ”i jÄpÄrslÄdzas uz 3.3 V.
// LCD vadÄ«bas tapas var pieŔķirt jebkurai digitÄlajai vai
// analogÄs tapas...bet mÄs izmantosim analogÄs tapas, jo tas mums ļauj
//āāāāāāāāāāāāā--|
// TFT Breakout ā Arduino UNO / Mega2560 / OPEN-SMART UNO melns
// 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
// PieŔķiriet cilvÄkiem lasÄmus nosaukumus dažÄm izplatÄ«tÄkajÄm 16 bitu krÄsu vÄrtÄ«bÄm:
#define MELNÄ 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define DZELTENS 0xFFE0
#define BALTS 0xFFFF
#define GREY 0x8C51
#define GRAYD 0x39E7
//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Izmantojot vairogu, visas vadÄ«bas un datu lÄ«nijas ir fiksÄtas un
// pÄc izvÄles var izmantot vienkÄrÅ”Äku deklarÄciju:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;
String dataString;
//String numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//String *numfileMonth="1.txt" (sizeof (numfileMonth));
////////////////////////////////////////////////////// /////////////////
void setup (void) {
rtc.begin();
// Lai iestatÄ«tu laiku, atÅemiet komentÄrus no vajadzÄ«gÄs rindiÅas
// rtc.setDOW(6); // NedÄļas diena
// rtc.setTime(22, 04, 0); // Laiks, 24 stundu formÄtÄ.
// rtc.setDate(4, 5, 2019); // Datums, 29. gada 2018. oktobris
Serial.begin (2000000);
//////// EkrÄna inicializÄcija
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Nosaukumi, aprÄ«kojuma piederumi, organizÄcijas nosaukums
tft.fillScreen(MELNS);
tft.setTextColor(BALTÄ);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println ("IZSTRÄDÄTÄJI UN BÅŖVE");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
kavÄÅ”anÄs (2000);
radio.begin(); // UzsÄkt darbu nRF24L01+
radio.setChannel(120); // NorÄdiet datu saÅemÅ”anas kanÄlu (no 0 lÄ«dz 127)
radio.setDataRate(RF24_250KBPS); // NorÄdiet datu pÄrraides Ätrumu (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // NorÄdiet raidÄ«tÄja jaudu (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Atveriet 1 cauruli ar 1 raidÄ«tÄja identifikatoru 0xAABBCCDD11, lai saÅemtu datus
// Atveriet 2. cauruli ar raidÄ«tÄja ID 2xAABBCCDD0, lai saÅemtu datus
radio.startListening(); // IeslÄdziet uztvÄrÄju, sÄciet klausÄ«ties atvÄrtÄs caurules
// radio.stopListening();
////////Pakalpojuma informÄcijas izvade
tft.fillScreen(MELNS);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////SÄciet inicializÄt SD karti
Serial.println ("SÄkotnÄjÄ SD karte");
tft.println ("SÄkotnÄjÄ SD karte");
tft.setCursor(8, 10);
////////Kartes inicializÄcija
if (!SD.begin(SD_CS_PIN)) {
Serial.println("sÄkotnÄji neizdevÄs!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("SÄkotnÄjÄ neizdevÄs!");
atgriezties;
}
tft.setTextColor(BALTÄ);
Serial.println("inicializÄcija veikta");
tft.println ("InicializÄcija pabeigta");
kavÄÅ”anÄs (2000);
////////Laika un datuma nolasīŔana un to pieŔķirŔana mainīgajiem
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Piespiedu kÄrtÄ izvadiet datumu, lai negaidÄ«tu, kad datums mainÄ«sies parÄdÄ«Å”anai
tft.setCursor(180, 0); // kursora pozīcijas iestatīŔana
tft.fillRect(178, 0, 65, 7, GREY); // laika izvades apgabala notīrīŔana
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Izvadiet vadības objektu nosaukumus
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("VinÄas I"));
////////ŽurnÄla faila izveide un izveides mÄÄ£inÄjuma rezultÄta izvadÄ«Å”ana
tft.setTextSize(1);
tft.setCursor(130, 10); // ja ir izveidots žurnÄlfails 2.txt, tad ierakstÄ«Å”ana failÄ turpinÄsies
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} VÄl {
mansFails = SD.open(perv, FILE_WRITE); // ja fails 2.txt neeksistÄ, tas tiks izveidots
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}
void loop (void) {
////////PÄrbauda, āāvai ir pieprasÄ«jums izvadÄ«t žurnÄlu COM porta monitoram
if (Serial.available() > 0) {
if (1 == Serial.lasīt());
////////Un ja tiek pieÅemts ā1ā, tad izvade
Fails myFile = SD.open(perv);
// ja fails ir pieejams, rakstiet tam:
if (mans fails) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("kļūda atverot .txt");
}
}
////////LasīŔanas laiks
t = rtc.getTime();
tft.setTextColor(BALTÄ);
////////Ja laiks ir mainÄ«jies, tad parÄdiet jaunos pulksteÅa rÄdÄ«jumus
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // kursora pozīcijas iestatīŔana
tft.fillRect(118, 0, 50, 7, GREY); // laika izvades apgabala notīrīŔana
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // izejas pulksteÅa rÄdÄ«jumi
time_sec_prev = t.sec;
}
////////Ja datums ir mainÄ«jies, tad parÄdiet jauno datumu
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // kursora pozīcijas iestatīŔana
tft.fillRect(178, 0, 65, 7, GREY); // notīrīt datuma displeja apgabalu
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // parÄdÄ«t datuma rÄdÄ«jumus
time_day_prev = t.date;
}
////////Ja ir pieejama radio uztverŔana, tad
if (radio.available(&pipe)) {
////////pÄrbaudot, vai saÅemÅ”anas buferis ir pilns,
radio.read(&data, sizeof(data));
////////ja ir pieejama vajadzÄ«gÄ raidÄ«tÄja adrese, tad
if (caurule == 1) {
////////gaida sinhronizÄcijas nulles secÄ«bu, lai noteiktu
//datu bloka sÄkums
if (dati == 0000) {
rc = 0;
} VÄl {
rc++;
}
////////Stundas 10. un 100. daļÄs reÄ£istrÄ skaitÄ«tÄju vÄrtÄ«bas un aprÄÄ·ina tos
if (rc == 1) {
leb_1 = dati / 3600.0;
}
if (rc == 2) {
leb_2 = dati / 3600.0;
}
if (rc == 3) {
leb_3 = dati / 3600.0;
}
if (rc == 4) {
leb_4 = dati / 3600.0;
}
}
}
r++;
k++; // tikai skaitÄ«tÄjs
//////// Datu atjaunoŔana ar noteiktu periodiskumu
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, PELÄKS);
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;
}
////////Ik pÄc 10 minÅ«tÄm ierakstiet datus žurnÄlÄ SD.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Virknes izveide .csv formÄtÄ
String dataString = Virkne (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Ierakstiet failÄ un izvadiet rakstÄ«Å”anas procesa rezultÄtus
mansFails = SD.open(perv, FILE_WRITE); // ja nav faila ar nosaukumu ā2.txtā, tas tiks izveidots.
if (mans fails) {
myFile.println(datu virkne);
myFile.close();
tft.fillRect(198, 8, 42, 10, ZAĻS);
tft.println("SD OK");
Serial.println("SD OK");
kavÄÅ”anÄs (900); // kavÄÅ”anÄs, pretÄjÄ gadÄ«jumÄ reÄ£istrÄ 13 identiskus rÄdÄ«jumus, lÄ«dz ir pagÄjusi sekunde
} VÄl {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}RakstzÄ«mju konvertÄÅ”anas programma/* PÄrkodÄt krievu fontus no UTF-8 uz Windows-1251 */
Virkne utf8rus (virknes avots)
{
int i,k;
StÄ«gu mÄrÄ·is;
neparakstīts char n;
char m[2] = { '0', ' ' };
k = avots.garums(); i = 0;
kamÄr (i < k) {
n = avots [i]; i++;
if (n >= 0xC0) {
slÄdzis (n) {
case 0xD0: {
n = avots [i]; i++;
ja (n == 0x81) { n = 0xA8; pÄrtraukums; }
ja (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
pÄrtraukuma;
}
case 0xD1: {
n = avots [i]; i++;
ja (n == 0x91) { n = 0xB8; pÄrtraukums; }
ja (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
pÄrtraukuma;
}
}
}
m[0] = n; mÄrÄ·is = mÄrÄ·is + String(m);
}
atgrieÅ”anÄs mÄrÄ·is;
}RakstzÄ«mju pÄrkodÄÅ”anas programma kirilicas izvadei, izmantojot bibliotÄku Adafruit_GFX, tiek ievietota tajÄ paÅ”Ä mapÄ ar galveno programmu. Jums arÄ« jÄaizstÄj fails glcdfont.c Adafruit_GFX ar citu fontu.
RezumÄjot, teikÅ”u, ka sistÄma attaisnoja uz sevi liktÄs cerÄ«bas, ir kļuvis vieglÄk uzraudzÄ«t iekÄrtu darbÄ«bas laiku. Lai arÄ« viss ir salikts uz maizes dÄļiem, par darbu uzreiz sÅ«dzÄ«bu nav. Pirmie elementi darbojas vairÄk nekÄ seÅ”us mÄneÅ”us un ir izturÄjuÅ”i ziemu.
Avots: www.habr.com