Lokalt autonomt datainsamlingssystem (fortsättning)

Börja på denna sida по ссылке.
Det bekvämaste alternativet för att hämta information om att slå på startmotorn visade sig vara alternativet med PC817 optokopplare. kretsschemaLokalt autonomt datainsamlingssystem (fortsättning)Skivorna innehåller tre likadana kretsar, allt är placerat i ABS plastlådor, storlek 100x100 mm. Foto av optokopplareLokalt autonomt datainsamlingssystem (fortsättning) När den är ansluten till startenheter med halvledarventiler är deras läckström tillräcklig för att öppna PC817 och räknaren kommer att utlösas felaktigt. För att utesluta en sådan situation ytterligare en läggs till i serie till kretsen för optokopplarens lysdiod och driftindikeringslysdioden. För att göra detta öppnas bygel J1 och ytterligare en LED LED1 löds in.
Mottagningsdelen är gjord på sida 1Lokalt autonomt datainsamlingssystem (fortsättning)sida 2Lokalt autonomt datainsamlingssystem (fortsättning)utvecklingskort kopplat till ARDUINO MEGA 2560. För detta används en dubbelradig kontakt i änden. En skärm med en upplösning på 240x400, med en resistiv pekskärm och en temperatursensor, används som informationsdisplay. HX8352B.Lokalt autonomt datainsamlingssystem (fortsättning) Dessutom tas kontakten till ICSP på skärmkortet bort och micro SD-kortplatsen används inte. Faktum är att det "native" SD-uttaget inte kan användas på grund av en konflikt på SPI-bussen. Till flashkortet användes en separat kortläsare, som inkluderade en 3,3V stabilisator och ett buffertchip med tre utgångslägen 74LVS125A. Det var här raken väntade på mig. En buffert i tre tillstånd, men antingen E01-ML01DP5 eller kortläsaren fungerade. I bibliotekskommentarerna såg SdFat en varning om inkompatibilitet med andra enheter. Nivåomvandlaren på TXS0108E togs bort och ersattes med byglar, pga E01-ML01DP5 är tolerant mot 5V-signaler - det hjälpte inte. Med hjälp av ett oscilloskop upptäcktes en signalförlust på MISO-linjen när en kortläsare var ansluten. Vid noggrann undersökning fann man att ingångarna för aktiveringssignalerna för OE 4-kanalerna på 74LVS125A helt enkelt löddes fast till en gemensam tråd och att det inte kunde vara tal om något tredje tillstånd. Buffertchippet användes som en primitiv nivåomvandlare från 5V till 3.3V med användning av 3,3 KΩ motstånd kopplade i serie med signalledningarna. Förutom MISO-linjen. Dess utgående bottenbrytare lockade förmodligen signaler till marknivån. Efter att ha fastställt att aktiveringssignalen för MISO-linjen var stift 13, revs den av från spåret ochlöddaLokalt autonomt datainsamlingssystem (fortsättning)mellan 9LVS74A CS-enheten välj ingångsstift (125) och termineringsmotståndet. Nu, om det inte finns någon åtkomst till minneskortet, är MISO-bufferten inaktiverad och stör inte driften av en annan enhet.Utvecklingstavla diagramLokalt autonomt datainsamlingssystem (fortsättning)Mottagare i driftLokalt autonomt datainsamlingssystem (fortsättning)DS3231 använder en mjukvaru-I2C-buss (TWI) för att ansluta klockan.
Arduino IDE-program// VIKTIGT: Adafruit_TFTLCD BIBLIOTEK MÅSTE VARA SPECIFIKT
// KONFIGURERAD FÖR ANTINGEN TFT-SKÖLDEN ELLER BRYTSKÄRDEN.
// SE RELEVANTA KOMMENTARER I Adafruit_TFTLCD.h FÖR INSTÄLLNING.
//av Open-Smart Team och Catalex Team
//[e-postskyddad]
//Lagra: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo Funktion: Visa grafik, tecken
//Arduino IDE: 1.6.5
// Styrelse: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#omfatta // Kärngrafikbibliotek
//#omfatta // Hårdvaruspecifikt bibliotek
#omfatta
MCUFRIEND_kbv tft;
#include "SdFat.h" // Använd SdFat-biblioteket
SdFat SD;
SdFile-fil;
Arkiv myFile;
#define SD_CS_PIN SS

#omfatta // Anslut biblioteket för att arbeta med SPI-bussen
#omfatta // Anslut inställningsfilen från RF24-biblioteket
#omfatta // Anslut biblioteket för att arbeta med nRF24L24+
RF24 radio(47, 49);

#omfatta

DS3231 rtc(27, 25);
Tid t;

uint16_t r = 6000;
uint32_t k = 0;

flyktiga osignerade långa data;
flyta leb_1;
flyta leb_2;
flyta leb_3;
flyta leb_4;

uint8_t pipe;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************** ****************/ /
// Om du använder OPEN-SMART TFT breakout board //
// Rekommenderar dig att lägga till 5V-3.3V nivåkonverteringskrets.
// Naturligtvis kan du använda OPEN-SMART UNO Black version med 5V/3.3V strömbrytare,
// du behöver bara byta till 3.3V.
// Kontrollstiften för LCD-skärmen kan tilldelas alla digitala eller
// analoga stift...men vi kommer att använda de analoga stiften eftersom detta tillåter oss
//——————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - ÅTERSTÄLL
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Tilldela mänskligt läsbara namn till några vanliga 16-bitars färgvärden:
#define SVART 0x0000
#define BLÅ 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define GUL 0xFFE0
#define WHITE 0xFFFF
#define GRÅ 0x8C51
#define GRÅD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Om du använder skölden är alla kontroll- och datalinjer fasta, och
// en enklare deklaration kan valfritt användas:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

ogiltig installation (ogiltig) {

rtc.begin();

// För att ställa in tiden, avkommentera de nödvändiga raderna
// rtc.setDOW(6); // Veckodag
// rtc.setTime(22, 04, 0); // Tid, i 24-timmarsformat.
// rtc.setDate(4, 5, 2019); // Datum 29 oktober 2018

Serial.begin (2000000);
//////// Skärminitiering
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Utmatning av namn, utrustningstillbehör, organisationsnamn
tft.fillScreen(SVART);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("UTVECKLARE & BYGGA");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
fördröjning (2000);

radio.begin(); // Initiera arbete nRF24L01+
radio.setChannel(120); // Ange datamottagningskanalen (från 0 till 127)
radio.setDataRate(RF24_250KBPS); // Ange dataöverföringshastigheten (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Specificera sändareffekten (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Öppna 1 rör med identifieraren för 1 sändare 0xAABBCCDD11, för att ta emot data
// Öppna rör 2 med sändar-ID 2xAABBCCDD0 för att ta emot data
radio.startListening(); // Slå på mottagaren, börja lyssna på öppna rör
// radio.stopListening();
////////Utmatning av tjänstinformation
tft.fillScreen(SVART);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Börja initialisera SD-kortet
Serial.println("Initialt SD-kort");
tft.println("Initialt SD-kort");
tft.setCursor(8, 10);
////////Initiering av kortet
if (!SD.begin(SD_CS_PIN)) {
Serial.println("initial misslyckades!");
tft.fillRect(8, 10, 85, 7, RÖD);
tft.setTextColor(SVART);
tft.println("Initial misslyckades!");
tillbaka;
}
tft.setTextColor(WHITE);
Serial.println("initiering klar");
tft.println("Initiering klar");
fördröjning (2000);
////////Läs tid och datum och tilldela dem till variabler
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.datum;
////////Tvinga ut datumet för att inte vänta på att datumet ska ändras för visning
tft.setCursor(180, 0); // ställer in markörens position
tft.fillRect(178, 0, 65, 7, GRÅ); // rensar tidsutdataområdet
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Skriv ut namnet på kontrollobjekt
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Vinchar I"));
////////Skapa en loggfil och mata ut resultatet av skapandeförsöket
tft.setTextSize(1);
tft.setCursor(130, 10); // om loggfil 2.txt skapas, fortsätter skrivningen till filen
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // om fil 2.txt inte existerar kommer den att skapas
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

ogiltig slinga (ogiltig) {
////////Kontrollerar att det finns en begäran om att mata ut en logg till COM-portmonitorn
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Och om "1" accepteras, då utgången
File myFile = SD.open(perv);
// om filen är tillgänglig, skriv till den:
if (min fil) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("fel vid öppning av .txt");
}
}
////////Lästid
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Om tiden har ändrats, visa de nya klockavläsningarna
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // ställer in markörens position
tft.fillRect(118, 0, 50, 7, GRÅ); // rensar tidsutdataområdet
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // mata ut klockavläsningar
time_sec_prev = t.sec;
}
////////Om datumet har ändrats, visa det nya datumet
if (time_day_prev != t.date) {
tft.setCursor(180, 0); // ställer in markörens position
tft.fillRect(178, 0, 65, 7, GRÅ); // rensa datumvisningsområdet
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // visa datumavläsningar
time_day_prev = t.datum;
}
////////Om radiomottagning är tillgänglig, då
if (radio.available(&pipe)) {
////////kontrollerar om mottagningsbufferten är full,
radio.read(&data, sizeof(data));
////////om den nödvändiga sändaradressen är tillgänglig, då
if (rör == 1) {
////////väntar på att en synkroniseringssekvens med nollor ska fastställas
//början av datablocket
if (data == 0000) {
rc = 0;
} Else {
rc++;
}
//////// Spela in räknarvärden och beräkna dem i 10:e och 100:e timme
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++; // bara en räknare
//////// Datauppdatering med en viss periodicitet
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GRÅD);
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;
}
////////Skriv data till loggen på SD var 10:e minut.
if ((t.min % 10 == 0) && (t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(SVART);
////////Skapa en sträng i .csv-format
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Skriv till en fil och mata ut resultatet av skrivprocessen
myFile = SD.open(perv, FILE_WRITE); // om det inte finns någon fil med namnet "2.txt", kommer den att skapas.
if (min fil) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, GRÖN);
tft.println("SD OK");
Serial.println("SD OK");
fördröjning(900); // fördröjning, annars registreras 13 identiska avläsningar tills en sekund har gått
} Else {
tft.fillRect(198, 8, 42, 10, RÖD);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Karaktärskonverteringsprogram/* Koda om ryska teckensnitt från UTF-8 till Windows-1251 */

String utf8rus(String source)
{
int i,k;
Strängmål;
osignerad char n;
char m[2] = { '0', ' ' };

k = source.length(); i = 0;

medan (i < k) {
n = källa[i]; i++;

if (n >= 0xC0) {
switch (n) {
fall 0xD0: {
n = källa[i]; i++;
om (n == 0x81) {n = 0xA8; ha sönder; }
om (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
fall 0xD1: {
n = källa[i]; i++;
om (n == 0x91) {n = 0xB8; ha sönder; }
om (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; target = target + String(m);
}
avkastningsmål;
}Teckenkodningsprogrammet för kyrillisk utdata med Adafruit_GFX-biblioteket placeras i samma mapp som huvudprogrammet. Du måste också ersätta filen glcdfont.c i Adafruit_GFX med ett annat typsnitt. Här bibliotek med nödvändig ersättning. Mer information om russifiering kan lätt hittas på Internet.
För att sammanfatta kommer jag att säga att systemet levde upp till förväntningarna, det har blivit lättare att övervaka drifttiden för utrustningen. Även om allt är monterat på brödskivor så finns det inga direkta klagomål på arbetet. De första elementen har fungerat i mer än ett halvår och har överlevt vintern. Senaste designen Den har varit igång för 9 kontrollerade enheter sedan den 5 mars och drifttiden registreras officiellt med den.

Källa: will.com

Lägg en kommentar