Paikallinen autonominen tiedonhankintajärjestelmä (jatkuu)

Aloita tältä sivustolta по ссылке.
Kätevin vaihtoehto käynnistimen käynnistämiseen liittyvien tietojen hakemiseen osoittautui PC817-optoerottimen vaihtoehdoksi. KytkentäkaavioPaikallinen autonominen tiedonhankintajärjestelmä (jatkuu)Levyt sisältävät kolme identtistä piiriä, kaikki on sijoitettu ABS-muovilaatikoihin, koko 100x100 mm. Kuva optoerottimistaPaikallinen autonominen tiedonhankintajärjestelmä (jatkuu) Puolijohdeventtiileillä varustettuihin käynnistyslaitteisiin kytkettynä niiden vuotovirta riittää avaamaan PC817:n ja laskuri laukeaa väärin. Sellaisen tilanteen sulkemiseksi pois yksi lisätään sarjaan optoerottimen LEDin ja toiminnan merkkivalon piiriin. Tätä varten hyppyjohdin J1 avataan ja ylimääräinen LED-LED1 juotetaan sisään.
Vastaanottava osa on tehty päälle puoli 1Paikallinen autonominen tiedonhankintajärjestelmä (jatkuu)puoli 2Paikallinen autonominen tiedonhankintajärjestelmä (jatkuu)Kehityskortti kytketty ARDUINO MEGA 2560:een. Tätä varten käytetään kaksirivistä liitintä päässä. Tietojen näyttölaitteena käytetään näyttöä, jonka resoluutio on 240x400 ja jossa on resistiivinen kosketusnäyttö ja lämpötila-anturi. HX8352B.Paikallinen autonominen tiedonhankintajärjestelmä (jatkuu) Lisäksi näyttölevyn ICSP:n liitin on poistettu eikä micro SD -korttipaikkaa käytetä. Tosiasia on, että "alkuperäistä" SD-liitäntää ei voida käyttää SPI-väylän ristiriidan vuoksi. Flash-kortille käytettiin erillistä kortinlukijaa, joka sisälsi 3,3V stabilisaattorin ja puskurisirun kolmella lähtötilalla 74LVS125A. Tässä rake odotti minua. Kolmen tilan puskuri, mutta joko E01-ML01DP5 tai kortinlukija toimi. SdFat näki kirjaston kommenteissa varoituksen yhteensopimattomuudesta muiden laitteiden kanssa. TXS0108E:n tasomuunnin poistettiin ja korvattiin jumpperien kanssa, koska E01-ML01DP5 sietää 5V signaaleja - se ei auttanut. Oskilloskoopin avulla havaittiin signaalin menetys MISO-linjalla, kun kortinlukija liitettiin. Huolellisen tarkastelun jälkeen todettiin, että 4LVS74A:n OE 125 -kanavien aktivointisignaalien tulot oli yksinkertaisesti juotettu yhteiseen johtimeen, eikä mistään kolmannesta tilasta voinut puhua. Puskurisirua käytettiin primitiivisenä tasonmuuntimena 5 V:sta 3.3 V:iin käyttämällä 3,3 KΩ vastuksia, jotka oli kytketty sarjaan signaalilinjojen kanssa. Paitsi MISO-linja. Sen ulostulon alakytkin todennäköisesti houkutteli signaaleja maanpinnalle. Todettuaan, että MISO-linjan aktivointisignaali oli nasta 13, se revittiin irti radasta jajuotettuPaikallinen autonominen tiedonhankintajärjestelmä (jatkuu)9LVS74A CS -laitteen valintanastan (125) ja päätevastuksen välillä. Nyt, jos muistikorttia ei voi käyttää, MISO-puskuri on poistettu käytöstä eikä häiritse toisen laitteen toimintaa.Kehityslevyn kaavioPaikallinen autonominen tiedonhankintajärjestelmä (jatkuu)Vastaanotin toiminnassaPaikallinen autonominen tiedonhankintajärjestelmä (jatkuu)DS3231 käyttää ohjelmisto-I2C-väylää (TWI) kellon kytkemiseen.
Arduino IDE -ohjelma// TÄRKEÄÄ: Adafruit_TFTLCD-KIRJASTO ON OLLA ERITYISESTI
// MÄÄRITTY JOKO TFT SHIELD -TAI BREAKOUT-ALUSTILLE.
// KATSO ASIAAN LIITTYVÄT KOMMENTIT OHJELMAN Adafruit_TFTLCD.h:sta ASETUKSET.
//Open-Smart Team ja Catalex Team
//[sähköposti suojattu]
//Kauppa: dx.com
// open-smart.aliexpress.com/store/1199788
//Esittelytoiminto: Näytä grafiikka, merkit
//Arduino IDE: 1.6.5
// Hallitus: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#sisältää // Grafiikkakirjasto
//#sisältää // Laitteistokohtainen kirjasto
#sisältää
MCUFRIEND_kbv tft;
#include "SdFat.h" // Käytä SdFat-kirjastoa
SdFat SD;
SdFile-tiedosto;
Tiedosto myFile;
#define SD_CS_PIN SS

#sisältää // Liitä kirjasto toimimaan SPI-väylän kanssa
#sisältää // Yhdistä asetustiedosto RF24-kirjastosta
#sisältää // Yhdistä kirjasto toimimaan nRF24L24+:n kanssa
RF24-radio(47, 49);

#sisältää

DS3231 rtc(27, 25);
aika t;

uint16_t r = 6000;
uint32_t k = 0;

haihtuva allekirjoittamaton pitkä data;
kellua leb_1;
kellua leb_2;
kellua leb_3;
kellua leb_4;

uint8_t putki;
int rc = 0;

uint8_t time_sec_prev;
uint8_t aika_päivä_edellinen;

//**************************************************** ****************//
// Jos käytät OPEN-SMART TFT breakout boardia //
// Suosittelemme lisäämään 5V-3.3V tason muunnospiirin.
// Tietysti voit käyttää OPEN-SMART UNO Black -versiota 5V/3.3V virtakytkimellä,
// sinun tarvitsee vain vaihtaa 3.3V.
// LCD-näytön ohjausnastat voidaan määrittää mihin tahansa digitaaliseen tai
// analogiset nastat...mutta käytämme analogisia nastoja, koska tämä mahdollistaa
//—————————————--|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Musta
// 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

// Määritä ihmisen luettavat nimet joillekin yleisille 16-bittisille väriarvoille:
#define MUSTA 0x0000
#define SININEN 0x001F
#define RED 0xF800
#define VIHREÄ 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define KELTAINEN 0xFFE0
#define VALKOINEN 0xFFFF
#define GREY 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Jos käytät suojausta, kaikki ohjaus- ja datarivit ovat kiinteitä, ja
// Valinnaisesti voidaan käyttää yksinkertaisempaa ilmoitusta:
// Adafruit_TFTLCD tft;
uint16_t g_tunniste;

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

void setup (void) {

rtc.begin();

// Asettaaksesi ajan, poista tarvittavat rivit
// rtc.setDOW(6); // Viikonpäivä
// rtc.setTime(22, 04, 0); // Aika, 24 tunnin muodossa.
// rtc.setDate(4, 5, 2019); // Päivämäärä, 29. lokakuuta 2018

Sarja-aloitus (2000000);
//////// Näytön alustus
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Nimet, varusteet, organisaation nimi
tft.fillScreen(MUSTA);
tft.setTextColor(VALKOINEN);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("KEHITTÄJÄT & RAKENNA");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
viive (2000);

radio.begin(); // Aloita työ nRF24L01+
radio.setChannel(120); // Määritä tiedon vastaanottokanava (0 - 127)
radio.setDataRate(RF24_250KBPS); // Määritä tiedonsiirtonopeus (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Määritä lähettimen teho (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Avaa 1 putki 1 lähettimen tunnisteella 0xAABBCCDD11 tietojen vastaanottamiseksi
// Avaa putki 2 lähettimen tunnuksella 2xAABBCCDD0 vastaanottaaksesi tietoja
radio.startListening(); // Kytke vastaanotin päälle, ala kuunnella avoimia putkia
// radio.stopListening();
////////Palvelutietojen tulostus
tft.fillScreen(MUSTA);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Aloita SD-kortin alustus
Serial.println("Alkuperäinen SD-kortti");
tft.println("Alkuperäinen SD-kortti");
tft.setCursor(8, 10);
////////Kortin alustus
if (!SD.begin(SD_CS_PIN)) {
Serial.println("alkuperäinen epäonnistui!");
tft.fillRect(8, 10, 85, 7, PUNAINEN);
tft.setTextColor(MUSTA);
tft.println("Alkuperäinen epäonnistui!");
palata;
}
tft.setTextColor(VALKOINEN);
Serial.println("alustus tehty");
tft.println("Alustus valmis");
viive (2000);
////////Ajan ja päivämäärän lukeminen ja niiden määrittäminen muuttujiin
t = rtc.getTime();
aika_sec_edellinen = t.sek;
aika_päivä_edellinen = t.date;
////////Pakota päivämäärä, jotta et odota päivämäärän muuttumista näyttöä varten
tft.setCursor(180, 0); // kohdistimen paikan asettaminen
tft.fillRect(178, 0, 65, 7, HARMAA); // tyhjennetään aikatulostusalue
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Tulosta ohjausobjektien nimet
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Vinssit I"));
////////Lokitiedoston luominen ja luontiyrityksen tuloksen tulostaminen
tft.setTextSize(1);
tft.setCursor(130, 10); // jos lokitiedosto 2.txt luodaan, tiedostoon kirjoittaminen jatkuu
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, TIEDOSTO_KIRJOITUS); // jos tiedostoa 2.txt ei ole olemassa, se luodaan
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop (void) {
////////Tarkistaa pyynnön lähettää loki COM-portin valvontaan
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Ja jos "1" hyväksytään, niin tulos
Tiedosto myFile = SD.open(perv);
// jos tiedosto on saatavilla, kirjoita siihen:
if (myFile) {
while (myFile.available()) {
Serial.write(omaTiedosto.read());
}
myFile.close();
}
else {
Serial.println("virhe avattaessa .txt");
}
}
////////Lukuaika
t = rtc.getTime();
tft.setTextColor(VALKOINEN);
////////Jos aika on muuttunut, näytä uudet kellon lukemat
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // kohdistimen paikan asettaminen
tft.fillRect(118, 0, 50, 7, HARMAA); // tyhjennetään aikatulostusalue
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // ulostulo kellon lukemat
aika_sec_edellinen = t.sek;
}
////////Jos päivämäärä on muuttunut, näytä uusi päivämäärä
if ( aika_päivä_edellinen != t.date) {
tft.setCursor(180, 0); // kohdistimen paikan asettaminen
tft.fillRect(178, 0, 65, 7, HARMAA); // tyhjennä päivämäärän näyttöalue
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // näyttää päivämäärälukemat
aika_päivä_edellinen = t.date;
}
////////Jos radiovastaanotto on saatavilla, niin
if (radio.available(&pipe)) {
////////tarkistaa onko vastaanottopuskuri täynnä,
radio.read(&data, sizeof(data));
////////jos tarvittava lähettimen osoite on saatavilla, niin
jos (putki == 1) {
////////odotetaan nollien synkronointisekvenssiä määrittääkseen
//tietolohkon alku
if (data == 0000) {
rc = 0;
} Else {
rc++;
}
////////Laskuriarvojen tallentaminen ja laskeminen tunnin 10:ssä ja 100:ssa
if (rc == 1) {
leb_1 = data / 3600.0;
}

if (rc == 2) {
leb_2 = data / 3600.0;
}

if (rc == 3) {
leb_3 = data / 3600.0;
}

if (rc == 4) {
leb_4 = data / 3600.0;
}
}
}
r++;
k++; // vain laskuri
//////// Tietojen päivitys tietyllä aikavälillä
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, HARMAA);
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;
}
////////Kirjoita tiedot lokiin SD:llä 10 minuutin välein.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(MUSTA);
////////Luo merkkijono .csv-muodossa
Merkkijono dataString = Merkkijono (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Kirjoita tiedostoon ja tulosta kirjoitusprosessin tulokset
myFile = SD.open(perv, TIEDOSTO_KIRJOITUS); // jos "2.txt"-nimistä tiedostoa ei ole, se luodaan.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, VIHREÄ);
tft.println("SD OK");
Serial.println("SD OK");
viive (900); // viive, muuten tallentaa 13 identtistä lukemaa, kunnes sekunti on kulunut
} Else {
tft.fillRect(198, 8, 42, 10, PUNAINEN);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Hahmon muunnosohjelma/* Koodaa venäläiset fontit uudelleen UTF-8:sta Windows-1251:een */

Merkkijono utf8rus (merkkijonolähde)
{
int i,k;
String tavoite;
allekirjoittamaton char n;
char m[2] = { '0', ' ' };

k = lähde.pituus(); i = 0;

kun (i < k) {
n = lähde [i]; i++;

if (n >= 0xC0) {
kytkin (n) {
tapaus 0xD0: {
n = lähde [i]; i++;
jos (n = = 0x81) { n = 0xA8; tauko; }
jos (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
tapaus 0xD1: {
n = lähde [i]; i++;
jos (n = = 0x91) { n = 0xB8; tauko; }
jos (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; kohde = kohde + merkkijono(m);
}
paluutavoite;
}Adafruit_GFX-kirjastoa käyttävä kyrillisen tulosteen merkkien transkoodausohjelma sijoitetaan samaan kansioon pääohjelman kanssa. Sinun on myös korvattava glcdfont.c-tiedosto Adafruit_GFX:ssä toisella kirjasimella. Täällä kirjasto tarvittavalla vaihdolla. Lisää tietoa venäläistämisestä löytyy helposti Internetistä.
Yhteenvetona totean, että järjestelmä vastasi odotuksia, laitteiden käyttöajan seuranta on helpottunut. Vaikka kaikki on koottu leipälaudoille, ei työstä ole välitöntä valittamista. Ensimmäiset elementit ovat toimineet yli kuusi kuukautta ja ovat selvinneet talvesta. Viimeisin muotoilu Se on ollut käytössä 9:llä ohjatulla yksiköllä maaliskuun 5. päivästä lähtien ja toiminta-aikaa rekisteröidään virallisesti sen avulla.

Lähde: will.com

Lisää kommentti