Local Autonomous Data Acquisition System (continued)

Start on this site here to register:.
The most convenient option for retrieving information about turning on the starter turned out to be the option with the PC817 optocoupler. Schematic diagramLocal Autonomous Data Acquisition System (continued)The boards contain three identical circuits, everything is placed in ABS plastic boxes, size 100x100 mm. Photo of optocouplersLocal Autonomous Data Acquisition System (continued) When connected to starting devices with semiconductor valves, their leakage current is sufficient to open the PC817 and the counter will trigger falsely. To exclude such a situation one more is added in series to the circuit of the optocoupler LED and the operation indication LED. To do this, jumper J1 is opened and an additional LED LED1 is soldered in.
The receiving part is made on side 1Local Autonomous Data Acquisition System (continued)side 2Local Autonomous Data Acquisition System (continued)development board connected to ARDUINO MEGA 2560. For this, a double-row connector is used at the end. A screen with a resolution of 240x400, having a resistive touchscreen and a temperature sensor, is used as an information display device. HX8352B.Local Autonomous Data Acquisition System (continued) Moreover, the connector to the ICSP on the screen board is removed and the micro SD slot is not used. The fact is that the “native” SD socket cannot be used due to a conflict on the SPI bus. For the flash card, a separate card reader was used, which included a 3,3V stabilizer and a buffer chip with three output states 74LVS125A. This is where the rake was waiting for me. A three-state buffer, but either the E01-ML01DP5 or the card reader worked. In the library comments, SdFat saw a warning about incompatibility with other devices. The level converter on the TXS0108E was removed and replaced with jumpers, because E01-ML01DP5 is tolerant to 5V signals - it did not help. Using an oscilloscope, a signal loss was detected on the MISO line when a card reader was connected. Upon careful examination, it was found that the inputs of the enabling signals of the OE 4 channels of the 74LVS125A were simply soldered to a common wire and there could be no talk of any third state. The buffer chip was used as a primitive level converter from 5V to 3.3V using 3,3 KΩ resistors connected in series with the signal lines. Except for the MISO line. Its output bottom switch probably attracted signals to the ground level. Having determined that the enable signal of the MISO line was pin 13, it was torn off from the track andsolderedLocal Autonomous Data Acquisition System (continued)between the 9LVS74A CS device select input pin (125) and the termination resistor. Now, if there is no access to the memory card, the MISO buffer is disabled and does not interfere with the operation of another device.Development board diagramLocal Autonomous Data Acquisition System (continued)Receiver in operationLocal Autonomous Data Acquisition System (continued)The DS3231 uses a software I2C bus (TWI) to connect the clock.
Arduino IDE Program// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP.
//by Open-Smart Team and Catalex Team
//[email protected]
//Store: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo Function: Display graphics, characters
//Arduino IDE: 1.6.5
// Board: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#include // core graphics library
//#include // Hardware-specific library
#include
MCUFRIEND_kbv tft;
#include "SdFat.h" // Use the SdFat library
SdFat SD;
SdFile file;
File myFile;
#define SD_CS_PIN SS

#include // Connect the library to work with the SPI bus
#include // Connect the settings file from the RF24 library
#include // Connect the library to work with nRF24L24+
RF24 radio(47, 49);

#include

DS3231 rtc(27, 25);
Time t;

uint16_t r = 6000;
uint32_t k = 0;

volatile unsigned long data;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

uint8_t pipe;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//****************************************************************/ /
// If you use OPEN-SMART TFT breakout board //
// Reconmend you to add 5V-3.3V level converting circuit.
// Of course you can use OPEN-SMART UNO Black version with 5V/3.3V power switch,
// you just need switch to 3.3V.
// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// 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

// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define GRAY 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// 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();

// To set the time, uncomment the necessary lines
// rtc.setDOW(6); // Day of the week
// rtc.setTime(22, 04, 0); // Time, in 24 hour format.
// rtc.setDate(4, 5, 2019); // Date, October 29, 2018

Serial.begin (2000000);
//////// Screen initialization
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Output of names, equipment accessories, organization name
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("DEVELOPERS & BUILD");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
delay (2000);

radio.begin(); // Initiate nRF24L01+
radio.setChannel(120); // Specify the data reception channel (from 0 to 127)
radio.setDataRate(RF24_250KBPS); // Specify the data transfer rate (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Specify the transmitter power (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Open 1 pipe with the identifier of 1 transmitter 0xAABBCCDD11, to receive data
// Open pipe 2 with transmitter ID 2xAABBCCDD0 to receive data
radio.startListening(); // Turn on the receiver, start listening to open pipes
// radio.stopListening();
////////Output of service information
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Start initializing the SD card
Serial.println("Initial SD card");
tft.println("Initial SD card");
tft.setCursor(8, 10);
////////Initializing the card
if (!SD.begin(SD_CS_PIN)) {
Serial.println("initial failed!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Initial failed!");
return;
}
tft.setTextColor(WHITE);
Serial.println("initialization done");
tft.println("Initialization done");
delay (2000);
////////Reading time and date and assigning them to variables
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Forcibly output the date so as not to wait for the date to change for display
tft.setCursor( 180, 0 ); // set cursor position
tft.fillRect(178, 0, 65, 7, GRAY); // clearing the time output area
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Output the name of control objects
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
////////Creating a log file and outputting the result of the creation attempt
tft.setTextSize(1);
tft.setCursor(130, 10); // if log file 2.txt is created, then writing to the file will continue
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // if file 2.txt does not exist, it will be created
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop(void) {
////////Checking the existence of a request to output a log to the COM port monitor
if (Serial.available() > 0) {
if (1 == Serial.read());
////////And if “1” is accepted, then the output
File myFile = SD.open(perv);
// if the file is available, write to it:
if (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("error opening .txt");
}
}
////////Reading time
t = rtc.getTime();
tft.setTextColor(WHITE);
////////If the time has changed, then display the new clock readings
if ( time_sec_prev != t.sec) {
tft.setCursor( 120, 0 ); // set cursor position
tft.fillRect(118, 0, 50, 7, GRAY); // clearing the time output area
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // print the clock
time_sec_prev = t.sec;
}
////////If the date has changed, then display the new date
if ( time_day_prev != t.date) {
tft.setCursor( 180, 0 ); // set cursor position
tft.fillRect(178, 0, 65, 7, GRAY); // clear date display area
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // display date readings
time_day_prev = t.date;
}
////////If radio reception is available, then
if (radio.available(&pipe)) {
////////checking whether the receive buffer is full,
radio.read(&data, sizeof(data));
////////if the required transmitter address is available, then
if (pipe == 1) {
////////waiting for a synchronizing sequence of zeros to determine
//beginning of the data block
if (data == 0000) {
rc = 0;
} Else {
rc++;
}
////////Recording counter values ​​and calculating them in 10th and 100ths of an hour
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++; // just a counter
//////// Data update with a certain periodicity
if ( 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;
}
////////Write data to the log on SD every 10 minutes.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Creating a string in .csv format
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Write to a file and output the results of the writing process
myFile = SD.open(perv, FILE_WRITE); // if there is no file named “2.txt”, it will be created.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println("SD OK");
Serial.println("SD OK");
delay(900); // delay, otherwise records 13 identical readings until a second has passed
} Else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Character conversion program/* Recode Russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', ' ' };

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

while (i < k) {
n = source[i]; i++;

if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB8; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}The character transcoding program for Cyrillic output using the Adafruit_GFX library is placed in the same folder with the main program. You also need to replace the glcdfont.c file in Adafruit_GFX with a different font. Here library with the required replacement. More information about Russification can be easily found on the Internet.
To summarize, I will say that the system lived up to expectations, it has become easier to monitor the operating time of the equipment. Even though everything is assembled on breadboards, there are no immediate complaints about the work. The first elements have been working for more than six months and have survived the winter. Latest design It has been running for 9 controlled units since March 5th and the operating time is being officially registered using it.

Source: habr.com

Add a comment