Yerli Avtonom Məlumat Alma Sistemi (davamı)

Bu saytda başlayın по ссылке.
Başlanğıcın işə salınması haqqında məlumat əldə etmək üçün ən əlverişli seçim PC817 optokuplatoru ilə seçim oldu. Şematik diaqramYerli Avtonom Məlumat Alma Sistemi (davamı)Lövhələr üç eyni sxemdən ibarətdir, hər şey 100x100 mm ölçülü ABS plastik qutulara yerləşdirilir. Optokuplların fotoşəkiliYerli Avtonom Məlumat Alma Sistemi (davamı) Yarımkeçirici klapanları olan başlanğıc qurğulara qoşulduqda, onların sızma cərəyanı PC817-ni açmaq üçün kifayətdir və sayğac yanlış işə düşəcək. Belə bir vəziyyəti istisna etmək üçün daha biri optocoupler LED və iş göstərici LED-in dövrəsinə ardıcıl olaraq əlavə olunur. Bunun üçün J1 jumper açılır və əlavə LED LED1 lehimlənir.
Qəbul hissəsi üzərində hazırlanır tərəf 1Yerli Avtonom Məlumat Alma Sistemi (davamı)tərəf 2Yerli Avtonom Məlumat Alma Sistemi (davamı)ARDUINO MEGA 2560-a qoşulmuş inkişaf lövhəsi. Bunun üçün sonunda iki cərgəli birləşdirici istifadə olunur. Rezistiv toxunma ekranı və temperatur sensoru olan 240x400 təsvir ölçülü ekran məlumatların göstərilməsi cihazı kimi istifadə olunur. HX8352B.Yerli Avtonom Məlumat Alma Sistemi (davamı) Üstəlik, ekran lövhəsindəki ICSP-yə birləşdirici çıxarılır və mikro SD yuvası istifadə edilmir. Fakt budur ki, SPI avtobusunda münaqişə səbəbindən "doğma" SD yuvası istifadə edilə bilməz. Fleş kart üçün 3,3V stabilizatoru və üç çıxış vəziyyəti 74LVS125A olan bufer çipini özündə birləşdirən ayrıca kart oxuyucusu istifadə edilmişdir. Burda dırmıq məni gözləyirdi. Üç ştatlı bufer, lakin ya E01-ML01DP5, ya da kart oxuyucusu işləyirdi. Kitabxananın şərhlərində SdFat digər cihazlarla uyğunsuzluq barədə xəbərdarlıq gördü. TXS0108E-də səviyyə çeviricisi çıxarıldı və jumpers ilə əvəz olundu, çünki E01-ML01DP5 5V siqnallarına dözümlüdür - kömək etmədi. Bir osiloskopdan istifadə edərək, kart oxuyucusu qoşulduqda MISO xəttində siqnal itkisi aşkar edildi. Diqqətlə araşdırıldıqdan sonra məlum oldu ki, 4LVS74A-nın OE 125 kanallarının aktivləşdirici siqnallarının girişləri sadəcə ümumi naqilə lehimlənib və heç bir üçüncü vəziyyətdən söhbət gedə bilməz. Bufer çipi siqnal xətləri ilə ardıcıl birləşdirilmiş 5 KΩ rezistorlardan istifadə edərək 3.3V-dən 3,3V-ə qədər primitiv səviyyə çeviricisi kimi istifadə edilmişdir. MISO xətti istisna olmaqla. Onun çıxış alt açarı ehtimal ki, yer səviyyəsinə siqnalları cəlb etmişdir. MISO xəttinin aktiv siqnalının pin 13 olduğunu müəyyən etdikdən sonra o, yoldan qopdu vəlehimliYerli Avtonom Məlumat Alma Sistemi (davamı)9LVS74A CS cihazı arasında giriş pinini (125) və dayandırma rezistorunu seçin. İndi yaddaş kartına giriş yoxdursa, MISO buferi söndürülür və başqa bir cihazın işinə mane olmur.İnkişaf lövhəsinin diaqramıYerli Avtonom Məlumat Alma Sistemi (davamı)Qəbuledici işləyirYerli Avtonom Məlumat Alma Sistemi (davamı)DS3231 saatı birləşdirmək üçün proqram I2C avtobusundan (TWI) istifadə edir.
Arduino IDE proqramı// Vacib: Adafruit_TFTLCD KİTABXANASI XÜSUSİ OLMALIDIR.
// YA TFT QALQANI VƏ YA PARÇASI ÜÇÜN KONFİKURLANDI.
// QURULMA ÜÇÜN Adafruit_TFTLCD.h SAYFASINA MÜVAFİQ ŞƏRHLƏRƏ BAXIN.
//Open-Smart Team və Catalex Team tərəfindən
//[e-poçt qorunur]
//Mağaza: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo funksiyası: Qrafikləri, simvolları göstərin
//Arduino IDE: 1.6.5
// Lövhə: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#daxildir // Əsas qrafik kitabxanası
//#daxil et // Aparat üçün xüsusi kitabxana
#daxildir
MCUFRIEND_kbv tft;
#include "SdFat.h" // SdFat kitabxanasından istifadə edin
SdFat SD;
SdFile faylı;
MyFile faylı;
#SD_CS_PIN SS-ni təyin edin

#daxildir // SPI avtobusu ilə işləmək üçün kitabxananı birləşdirin
#daxildir // RF24 kitabxanasından parametrlər faylını birləşdirin
#daxildir // nRF24L24+ ilə işləmək üçün kitabxananı birləşdirin
RF24 radio(47, 49);

#daxildir

DS3231 rtc(27, 25);
Vaxt t;

uint16_t r = 6000;
uint32_t k = 0;

uçucu imzalanmamış uzun məlumatlar;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

uint8_t boru;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//**************************************************** ****************//
// Əgər siz OPEN-SMART TFT çıxış lövhəsindən istifadə edirsinizsə //
// 5V-3.3V səviyyəyə çevirən dövrə əlavə etməyi tövsiyə edirik.
// Əlbəttə ki, siz 5V/3.3V güc açarı ilə OPEN-SMART UNO Black versiyasından istifadə edə bilərsiniz,
// sadəcə 3.3V-ə keçmək lazımdır.
// LCD üçün idarəetmə pinləri istənilən rəqəmsal və ya
// analoq sancaqlar...lakin biz analoq sancaqlardan istifadə edəcəyik, çünki bu bizə imkan verir
//——————————————--|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Qara
// 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

// Bəzi ümumi 16 bitlik rəng dəyərlərinə insan tərəfindən oxuna bilən adlar təyin edin:
#QARA 0x0000 təyin edin
#məvi 0x001F təyin edin
#QIRMIZI 0xF800 təyin edin
#YAŞIL 0x07E0 təyin edin
#CYAN 0x07FF müəyyən edin
#MAGENTA 0xF81F müəyyən edin
#SARI 0xFFE0 təyin edin
#AĞ 0xFFFF müəyyən edin
#define GREY 0x8C51
#GrayD 0x39E7 təyin edin

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Qalxandan istifadə edilərsə, bütün idarəetmə və məlumat xətləri sabitlənir və
// isteğe bağlı olaraq daha sadə bəyannamə istifadə edilə bilər:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

boş quraşdırma (boşluq) {

rtc.begin();

// Vaxtı təyin etmək üçün lazım olan sətirləri şərhdən çıxarın
// rtc.setDOW(6); // Həftənin günü
// rtc.setTime(22, 04, 0); // Vaxt, 24 saat formatında.
// rtc.setDate(4, 5, 2019); // Tarix, 29 oktyabr 2018-ci il

Serial.begin (2000000);
//////// Ekranın işə salınması
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(doğru);
//////////////////Adların çıxışı, avadanlıq aksesuarları, təşkilat adı
tft.fillScreen(QARA);
tft.setTextColor(AĞ);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("İnkişaf edənlər və qurun");
tft.setCursor(30, 20);
tft.print (utf8rus("Konstruktor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
gecikmə (2000);

radio.begin(); // nRF24L01+ işə başlayın
radio.setChannel(120); // Məlumat qəbulu kanalını təyin edin (0-dan 127-yə qədər)
radio.setDataRate(RF24_250KBPS); // Məlumat ötürmə sürətini təyin edin (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Ötürücü gücünü təyin edin (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Məlumat qəbul etmək üçün 1 ötürücü 1xAABBCCDD0 identifikatoru ilə 11 boruyu açın
// Məlumat qəbul etmək üçün ötürücü ID 2xAABBCCDD2 ilə boru 0-ni açın
radio.startListening(); // Qəbuledicini yandırın, açıq boruları dinləməyə başlayın
// radio.stopListening();
////////Xidmət məlumatının çıxışı
tft.fillScreen(QARA);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////SD kartı işə salmağa başlayın
Serial.println("İlkin SD kart");
tft.println("İlkin SD kart");
tft.setCursor(8, 10);
////////Kartın işə salınması
əgər (!SD.begin(SD_CS_PIN)) {
Serial.println("ilkin uğursuz oldu!");
tft.fillRect(8, 10, 85, 7, QIRMIZI);
tft.setTextColor(QARA);
tft.println("İlkin əməliyyat uğursuz oldu!");
qaytarmaq;
}
tft.setTextColor(AĞ);
Serial.println("insiallaşdırma tamamlandı");
tft.println("İnsiallaşdırma tamamlandı");
gecikmə (2000);
////////Saat və tarixin oxunması və onların dəyişənlərə təyin edilməsi
t = rtc.getTime();
time_sec_prev = t.san;
time_day_prev = t.date;
////////Görünüş üçün tarixin dəyişməsini gözləməmək üçün tarixi zorla çıxarın
tft.setCursor(180, 0); // kursorun yerini təyin etmək
tft.fillRect(178, 0, 65, 7, BOZ); // vaxtın çıxış sahəsinin təmizlənməsi
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////İdarəetmə obyektlərinin adını çıxarın
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Vinçlər I"));
////////Giriş faylının yaradılması və yaratma cəhdinin nəticəsinin çıxarılması
tft.setTextSize(1);
tft.setCursor(130, 10); // əgər log faylı 2.txt yaradılıbsa, o zaman fayla yazmaq davam edəcək
əgər (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // əgər 2.txt faylı yoxdursa, o yaradılacaq
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

boşluq loop (boşluq) {
////////COM port monitoruna jurnal çıxarmaq üçün sorğunun mövcudluğunun yoxlanılması
əgər (Serial.available() > 0) {
əgər (1 == Serial.read());
////////Və “1” qəbul edilirsə, o zaman çıxış
Fayl myFile = SD.open(perv);
// əgər fayl mövcuddursa, ona yazın:
əgər (mənim faylım) {
isə (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
başqa {
Serial.println(".txt açılış xətası");
}
}
////////Oxu vaxtı
t = rtc.getTime();
tft.setTextColor(AĞ);
////////Vaxt dəyişibsə, yeni saat oxunuşlarını göstərin
əgər (time_sec_prev != t.san) {
tft.setCursor(120, 0); // kursorun yerini təyin etmək
tft.fillRect(118, 0, 50, 7, BOZ); // vaxtın çıxış sahəsinin təmizlənməsi
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // saat oxunuşları
time_sec_prev = t.san;
}
////////Tarix dəyişibsə, yeni tarixi göstərin
əgər (saat_gün_əvvəlki != t.tarix) {
tft.setCursor(180, 0); // kursorun yerini təyin etmək
tft.fillRect(178, 0, 65, 7, BOZ); // tarix göstərmə sahəsini təmizləyin
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // tarix oxunuşlarını göstərin
time_day_prev = t.date;
}
////////Əgər radio qəbulu mövcuddursa, o zaman
əgər (radio.available(&pipe)) {
////////qəbul buferinin dolu olub olmadığını yoxlamaq,
radio.read(&data, sizeof(data));
////////əgər tələb olunan ötürücü ünvanı mövcuddursa, o zaman
əgər (boru == 1) {
////////müəyyən etmək üçün sıfırların sinxronizasiya ardıcıllığını gözləyirik
//məlumat blokunun başlanğıcı
əgər (məlumat == 0000) {
rc = 0;
} Else {
rc++;
}
////////Saytın 10 və 100-də sayğac dəyərlərinin qeyd edilməsi və hesablanması
əgər (rc == 1) {
leb_1 = məlumat / 3600.0;
}

əgər (rc == 2) {
leb_2 = məlumat / 3600.0;
}

əgər (rc == 3) {
leb_3 = məlumat / 3600.0;
}

əgər (rc == 4) {
leb_4 = məlumat / 3600.0;
}
}
}
r++;
k++; // sadəcə bir sayğac
//////// Məlumatların müəyyən dövriliklə yenilənməsi
əgər ( 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;
}
////////Hər 10 dəqiqədən bir SD-dəki loga məlumat yazın.
əgər ((t.dəq % 10 == 0) && ( t.san == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(QARA);
////////.csv formatında sətir yaradılması
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Bir fayla yazın və yazı prosesinin nəticələrini çıxarın
myFile = SD.open(perv, FILE_WRITE); // “2.txt” adlı fayl yoxdursa, o yaradılacaq.
əgər (mənim faylım) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, YAŞIL);
tft.println("SD OK");
Serial.println("SD OK");
gecikmə (900); // gecikmə, əks halda saniyə keçənə qədər 13 eyni oxunuşu qeyd edir
} Else {
tft.fillRect(198, 8, 42, 10, QIRMIZI);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Simvol çevirmə proqramı/* Rus şriftlərini UTF-8-dən Windows-1251-ə yenidən yazın */

String utf8rus(String mənbəyi)
{
int i,k;
Simli hədəf;
imzasız char n;
char m[2] = { '0', ' ' };

k = mənbə.uzunluq(); i = 0;

isə (i <k) {
n = mənbə[i]; i++;

əgər (n >= 0xC0) {
keçid (n) {
hal 0xD0: {
n = mənbə[i]; i++;
əgər (n == 0x81) { n = 0xA8; fasilə; }
əgər (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
fasilə;
}
hal 0xD1: {
n = mənbə[i]; i++;
əgər (n == 0x91) { n = 0xB8; fasilə; }
əgər (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
fasilə;
}
}
}
m[0] = n; hədəf = hədəf + String(m);
}
qayıdış hədəfi;
}Adafruit_GFX kitabxanasından istifadə edərək kiril əlifbası ilə çıxış üçün simvolların kodlaşdırılması proqramı əsas proqramla eyni qovluğa yerləşdirilir. Siz həmçinin Adafruit_GFX-də glcdfont.c faylını başqa şriftlə əvəz etməlisiniz. Burada tələb olunan əvəz ilə kitabxana. Ruslaşdırma haqqında daha çox məlumatı İnternetdə asanlıqla tapmaq olar.
Xülasə etmək üçün deyim ki, sistem gözləntiləri doğrultdu, avadanlıqların işləmə müddətinə nəzarət etmək asanlaşdı. Hər şey çörək lövhələrində yığılsa da, işdən dərhal şikayət yoxdur. İlk elementlər altı aydan çox işləyir və qışdan sağ çıxdı. Ən son dizayn Martın 9-dən etibarən 5 idarə olunan aqreqat üçün fəaliyyət göstərir və ondan istifadə etməklə iş vaxtı rəsmi qeydiyyata alınır.

Mənbə: www.habr.com

Добавить комментарий