Lokaal autonoom data-acquisitiesysteem (vervolg)

Begin op deze site link.
De handigste optie voor het opvragen van informatie over het inschakelen van de starter bleek de optie met de PC817 optocoupler. schakelschemaLokaal autonoom data-acquisitiesysteem (vervolg)De borden bevatten drie identieke schakelingen, alles is geplaatst in ABS-kunststof dozen, formaat 100x100 mm. Foto van optocouplersLokaal autonoom data-acquisitiesysteem (vervolg) Wanneer aangesloten op startapparaten met halfgeleiderkleppen, is hun lekstroom voldoende om de PC817 te openen en zal de teller ten onrechte activeren. Om een ​​dergelijke situatie uit te sluiten er wordt er nog één in serie toegevoegd aan het circuit van de optocoupler-LED en de bedrijfsindicatie-LED. Hiervoor wordt jumper J1 geopend en wordt er een extra LED LED1 ingesoldeerd.
Het ontvangende deel is erop gemaakt kant 1Lokaal autonoom data-acquisitiesysteem (vervolg)kant 2Lokaal autonoom data-acquisitiesysteem (vervolg)ontwikkelbord aangesloten op ARDUINO MEGA 2560. Hiervoor wordt aan het uiteinde een dubbele rij connector gebruikt. Als informatieweergaveapparaat wordt een scherm met een resolutie van 240x400, voorzien van een resistief touchscreen en een temperatuursensor, gebruikt. HX8352B.Lokaal autonoom data-acquisitiesysteem (vervolg) Bovendien is de connector naar de ICSP op het schermbord verwijderd en wordt het micro SD-slot niet gebruikt. Feit is dat de “native” SD-socket niet kan worden gebruikt vanwege een conflict op de SPI-bus. Voor de flashkaart werd een aparte kaartlezer gebruikt, die een 3,3V-stabilisator en een bufferchip met drie uitgangsstatussen 74LVS125A bevatte. Hier stond de hark op mij te wachten. Een buffer met drie toestanden, maar de E01-ML01DP5 of de kaartlezer werkte. In de opmerkingen van de bibliotheek zag SdFat een waarschuwing over incompatibiliteit met andere apparaten. De niveau-omzetter op de TXS0108E is verwijderd en vervangen door jumpers, omdat E01-ML01DP5 is tolerant voor 5V-signalen - het hielp niet. Met behulp van een oscilloscoop werd een signaalverlies op de MISO-lijn gedetecteerd toen een kaartlezer werd aangesloten. Bij zorgvuldig onderzoek bleek dat de ingangen van de activeringssignalen van de OE 4-kanalen van de 74LVS125A eenvoudigweg aan een gemeenschappelijke draad waren gesoldeerd en dat er geen sprake kon zijn van een derde toestand. De bufferchip werd gebruikt als een primitieve niveau-omzetter van 5V naar 3.3V met behulp van weerstanden van 3,3 KΩ die in serie waren geschakeld met de signaallijnen. Behalve de MISO-lijn. De onderste uitgangsschakelaar trok waarschijnlijk signalen naar het grondniveau. Nadat was vastgesteld dat het activeringssignaal van de MISO-lijn pin 13 was, werd deze van de baan gescheurd engesoldeerdLokaal autonoom data-acquisitiesysteem (vervolg)tussen de 9LVS74A CS-apparaatselectie-ingangspin (125) en de afsluitweerstand. Als er nu geen toegang is tot de geheugenkaart, wordt de MISO-buffer uitgeschakeld en interfereert deze niet met de werking van een ander apparaat.OntwikkelingsborddiagramLokaal autonoom data-acquisitiesysteem (vervolg)Ontvanger in bedrijfLokaal autonoom data-acquisitiesysteem (vervolg)De DS3231 maakt gebruik van een software I2C-bus (TWI) om de klok aan te sluiten.
Arduino IDE-programma// BELANGRIJK: Adafruit_TFTLCD-BIBLIOTHEEK MOET SPECIFIEK ZIJN
// GECONFIGUREERD VOOR HET TFT-SCHERM OF HET BREAKOUT-BORD.
// ZIE RELEVANTE OPMERKINGEN IN Adafruit_TFTLCD.h VOOR INSTALLATIE.
//door Open-Smart Team en Catalex Team
//[e-mail beveiligd]
//Winkel: dx.com
// open-smart.aliexpress.com/store/1199788
//Demofunctie: afbeeldingen en tekens weergeven
// Arduino IDE: 1.6.5
// Bord: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Bord: 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

#erbij betrekken // Core grafische bibliotheek
//#erbij betrekken // Hardwarespecifieke bibliotheek
#erbij betrekken
MCUFRIEND_kbv tft;
#include "SdFat.h" // Gebruik de SdFat-bibliotheek
SDFat SD;
SdFile-bestand;
Bestand mijnBestand;
#define SD_CS_PIN SS

#erbij betrekken // Sluit de bibliotheek aan om met de SPI-bus te werken
#erbij betrekken // Verbind het instellingenbestand uit de RF24-bibliotheek
#erbij betrekken // Sluit de bibliotheek aan om met nRF24L24+ te werken
RF24-radio(47, 49);

#erbij betrekken

DS3231rtc(27, 25);
Tijd t;

uint16_t r = 6000;
uint32_t k = 0;

vluchtige, niet-ondertekende lange gegevens;
zweven leb_1;
zweven leb_2;
zweven leb_3;
zweven leb_4;

uint8_t pijp;
intrc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************** ***************/ /
// Als u een OPEN-SMART TFT-breakoutbord gebruikt //
// Raden u aan om een ​​5V-3.3V-niveauconversiecircuit toe te voegen.
// Natuurlijk kunt u de OPEN-SMART UNO zwarte versie gebruiken met 5V/3.3V aan/uit-schakelaar,
// je hoeft alleen maar over te schakelen naar 3.3V.
// De controlepinnen voor het LCD-scherm kunnen worden toegewezen aan elke digitale of
// analoge pinnen...maar we zullen de analoge pinnen gebruiken zoals dit ons toestaat
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Zwart
// 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

// Wijs voor mensen leesbare namen toe aan enkele algemene 16-bits kleurwaarden:
#definieer ZWART 0x0000
#define BLAUW 0x001F
#define ROOD 0xF800
#define GROEN 0x07E0
#define CYAAN 0x07FF
#define MAGENTA 0xF81F
#define GEEL 0xFFE0
#define WIT 0xFFFF
#define GRIJS 0x8C51
#define GRIJS 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Bij gebruik van het schild zijn alle besturings- en datalijnen vast, en
// optioneel kan een eenvoudigere declaratie worden gebruikt:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

TekenreeksgegevensString;
//String numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//String *numfileMonth = "1.txt" (grootte van (numfileMonth));
//////////////////////////////////////////// ///////////////

ongeldige setup (ongeldig) {

rtc.begin();

// Om de tijd in te stellen, verwijdert u de commentaartekens op de benodigde regels
//rtc.setDOW(6); // Dag van de week
//rtc.setTime(22, 04, 0); // Tijd, in 24-uursnotatie.
// rtc.setDate(4, 5, 2019); // Datum, 29 oktober 2018

Serial.begin (2000000);
//////// Scherminitialisatie
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(waar);
//////////////////Uitvoer van namen, apparatuuraccessoires, naam van de organisatie
tft.fillScreen (ZWART);
tft.setTextColor(WIT);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("ONTWIKKELAARS & BOUW");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner II." ));
vertraging (2000);

radio.begin(); // Start werkzaamheden nRF24L01+
radio.setChannel(120); // Specificeer het gegevensontvangstkanaal (van 0 tot 127)
radio.setDataRate(RF24_250KBPS); // Specificeer de gegevensoverdrachtsnelheid (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Specificeer het zendvermogen (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Open 1 pijp met de identificatie van 1 zender 0xAABBCCDD11, om gegevens te ontvangen
// Open pijp 2 met zender-ID 2xAABBCCDD0 om gegevens te ontvangen
radio.startListening(); // Zet de ontvanger aan, luister naar open pijpen
// radio.stopListening();
////////Uitvoer van service-informatie
tft.fillScreen (ZWART);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Start met het initialiseren van de SD-kaart
Serial.println("Initiële SD-kaart");
tft.println("Initiële SD-kaart");
tft.setCursor(8, 10);
////////De kaart initialiseren
als (!SD.begin(SD_CS_PIN)) {
Serial.println("initiële mislukt!");
tft.fillRect(8, 10, 85, 7, ROOD);
tft.setTextColor(ZWART);
tft.println("Initiële mislukt!");
terug te keren;
}
tft.setTextColor(WIT);
Serial.println("initialisatie voltooid");
tft.println("Initialisatie voltooid");
vertraging (2000);
////////Tijd en datum lezen en deze aan variabelen toewijzen
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.datum;
//////// Voer de datum geforceerd uit om niet te wachten tot de datum verandert voordat deze wordt weergegeven
tft.setCursor(180, 0); // de cursorpositie instellen
tft.fillRect(178, 0, 65, 7, GRIJS); // het tijduitvoergebied leegmaken
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Voer de naam van de besturingsobjecten uit
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Lieren I"));
////////Een logbestand maken en het resultaat van de aanmaakpoging uitvoeren
tft.setTextSize(1);
tft.setCursor(130, 10); // als logbestand 2.txt is gemaakt, wordt het schrijven naar het bestand voortgezet
als (SD.bestaat(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serieel.println(perv);
} Else {
mijnBestand = SD.open(perv, FILE_WRITE); // als bestand 2.txt niet bestaat, wordt het aangemaakt
mijnBestand.close();
tft.println(perv);
Serieel.println(perv);
}
}

leegte lus (leegte) {
////////Controleren of er een verzoek bestaat om een ​​log uit te voeren naar de COM-poortmonitor
if (Serial.available() > 0) {
als (1 == Serieel.lezen());
////////En als “1” wordt geaccepteerd, dan is de uitvoer
Bestand mijnBestand = SD.open(perv);
// als het bestand beschikbaar is, schrijf er dan naar:
als (mijnBestand) {
while (mijnbestand.beschikbaar()) {
Serial.write(mijnBestand.lezen());
}
mijnBestand.close();
}
else {
Serial.println("fout bij openen .txt");
}
}
////////Leestijd
t = rtc.getTime();
tft.setTextColor(WIT);
////////Als de tijd is veranderd, geef dan de nieuwe klokmetingen weer
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // de cursorpositie instellen
tft.fillRect(118, 0, 50, 7, GRIJS); // het tijduitvoergebied leegmaken
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // uitvoerklokmetingen
time_sec_prev = t.sec;
}
////////Als de datum is gewijzigd, geef dan de nieuwe datum weer
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // de cursorpositie instellen
tft.fillRect(178, 0, 65, 7, GRIJS); // duidelijk datumweergavegebied
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // datummetingen weergeven
time_day_prev = t.datum;
}
////////Als radio-ontvangst beschikbaar is, dan
if (radio.beschikbaar(&pipe)) {
////////controleren of de ontvangstbuffer vol is,
radio.read(&data, groottevan(data));
////////als het gewenste zenderadres beschikbaar is, dan
als (pijp == 1) {
////////wachten op een synchronisatiereeks nullen om te bepalen
//begin van het datablok
als (gegevens == 0000) {
rc = 0;
} Else {
rc++;
}
//////// Tellerwaarden registreren en berekenen in 10e en 100e van een uur
als (rc == 1) {
leb_1 = gegevens / 3600.0;
}

als (rc == 2) {
leb_2 = gegevens / 3600.0;
}

als (rc == 3) {
leb_3 = gegevens / 3600.0;
}

als (rc == 4) {
leb_4 = gegevens / 3600.0;
}
}
}
r++;
k++; // gewoon een teller
//////// Gegevensupdate met een bepaalde periodiciteit
als ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GRIJS);
Serial.println("Lebedki I");
tft.setCursor(0, 41);
tft.println(leb_1);
Serieel.println(leb_1);
tft.println(leb_2);
Serieel.println(leb_2);
tft.println(leb_3);
Serieel.println(leb_3);
tft.println(leb_4);
Serieel.println(leb_4);
Serieel.println(k);
r = 0;
}
////////Schrijf elke 10 minuten gegevens naar de inlog-SD.
als ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(ZWART);
////////Een tekenreeks maken in .csv-indeling
Tekenreeks dataString = Tekenreeks (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Schrijf naar een bestand en voer de resultaten van het schrijfproces uit
mijnBestand = SD.open(perv, FILE_WRITE); // als er geen bestand is met de naam “2.txt”, wordt het aangemaakt.
als (mijnBestand) {
mijnBestand.println(dataString);
mijnBestand.close();
tft.fillRect(198, 8, 42, 10, GROEN);
tft.println("SD OK");
Serieel.println("SD OK");
vertraging(900); // vertraging, registreert anders 13 identieke metingen totdat er een seconde is verstreken
} Else {
tft.fillRect(198, 8, 42, 10, ROOD);
tft.println("SD-ERR");
Serial.println("SD-ERR");
}
}
}Karakterconversieprogramma/* Russische lettertypen hercoderen van UTF-8 naar Windows-1251 */

Tekenreeks utf8rus (tekenreeksbron)
{
int ik,k;
Tekenreeksdoel;
niet-ondertekend teken n;
char m[2] = { '0', ' ' };

k = bron.lengte(); ik = 0;

terwijl (ik <k) {
n = bron[i]; ik++;

als (n >= 0xC0) {
schakelaar (n) {
geval 0xD0: {
n = bron[i]; ik++;
als (n == 0x81) { n = 0xA8; pauze; }
als (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
te breken;
}
geval 0xD1: {
n = bron[i]; ik++;
als (n == 0x91) { n = 0xB8; pauze; }
als (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
te breken;
}
}
}
m[0] = n; doel = doel + String(m);
}
terugkeerdoel;
}Het tekentranscoderingsprogramma voor Cyrillische uitvoer met behulp van de Adafruit_GFX-bibliotheek wordt in dezelfde map geplaatst als het hoofdprogramma. U moet ook het bestand glcdfont.c in Adafruit_GFX vervangen door een ander lettertype. Hier bibliotheek met de vereiste vervanging. Meer informatie over russificatie is eenvoudig te vinden op internet.
Samenvattend zal ik zeggen dat het systeem aan de verwachtingen voldeed, het is gemakkelijker geworden om de bedrijfstijd van de apparatuur te controleren. Ondanks dat alles op breadboards is gemonteerd, zijn er niet direct klachten over het werk. De eerste elementen werken al ruim een ​​half jaar en hebben de winter overleefd. Nieuwste ontwerp Het draait sinds 9 maart voor 5 gecontroleerde eenheden en de bedrijfstijd wordt er officieel mee geregistreerd.

Bron: www.habr.com

Voeg een reactie