Hệ thống thu thập dữ liệu tự trị cục bộ

Công ty đã mua các trạm giám sát NEKST-M do Next Technologies sản xuất trong nước. Để đảm bảo hình dung được hoạt động của các đơn vị bơm,
báo cháy và an ninh, điện áp lúc khởi động, nhiệt độ phòng, mực nước khẩn cấp. Trái tim của NEKST-M là ATMEGA 1280 và thực tế này rất đáng khích lệ về khả năng tạo ra bộ sản phẩm của riêng bạn cho các nhu cầu cụ thể.

Nhiệm vụ được đặt ra là tạo ra một hệ thống điều phối địa phương hoàn toàn tự động cho các nhu cầu cụ thể trong thời gian ngắn nhất có thể và với chi phí tối thiểu. Cơ sở là một vi điều khiển. Phát triển, sản xuất, do chính nhân viên sáng tạo ra.

Hệ thống phải hoạt động không phụ thuộc vào mạng di động, máy chủ, Internet và hệ thống cấp phép sử dụng tài nguyên tần số vô tuyến điện, không sử dụng máy tính trong quá trình vận hành hệ thống điều khiển, quản lý hoặc tối đa là định kỳ sử dụng máy tính xách tay, không được truy cập vào hệ thống. vật trong thời gian dài (6-9 tháng). Cấu hình mạng có cấu trúc xuyên tâm. Dữ liệu được thu thập tại một thời điểm và sau đó được gửi đi xử lý thông qua các kênh liên lạc thông thường hoặc dưới dạng bản cứng.

Hệ thống phải cung cấp:

  • giám sát hoạt động của các đơn vị bơm
  • tự động hóa công nghệ
  • bảo vệ khỏi hậu quả của tình trạng khẩn cấp
  • tín hiệu khẩn cấp
  • tính toán thời gian vận hành
  • tính toán lượng điện tiêu thụ
  • kiểm soát nhiệt độ thiết bị
  • an ninh và báo cháy
  • ghi thông tin từ xa định kỳ
  • yêu cầu tương lai chưa biết

Điều kiện làm việc:

  • vùng phủ sóng 1 km vuông.
  • tầm nhìn trực tiếp giữa các đối tượng
  • nhiệt độ từ +50 đến -50 C
  • độ ẩm lên tới 100%
  • cặn có hoạt tính sinh học (nấm mốc, vi khuẩn khử sunfat)
  • độ rung, không hơn, của máy loại 1-2 theo GOST ISO 10816-1-97
  • môi trường điện từ - chuyển mạch động cơ điện với công tắc tơ KT 6053, thiết bị khởi động mềm RVS-DN, thiết bị điều khiển PID SIEMENS MICROMASTER, bức xạ trong dải ISM và GSM theo yêu cầu cho các thiết bị này, hàn hồ quang thủ công tại chỗ
  • điện áp mạng quá cao, gián đoạn nguồn điện trong thời gian ngắn, quá điện áp do sét, mất cân bằng pha khi đường dây trên không bị đứt trong mạng phân phối 6-10 kV.

Mặc dù có những yêu cầu khắt khe như vậy nhưng việc thực hiện khá đơn giản khi giải quyết vấn đề theo từng bước.

Tính đến mọi thứ, bo mạch “Arduino Nano 3.0” đã trở thành “bộ não” của kế hoạch. Bo mạch robotdyn có bộ điều khiển ATMEGA 328, bộ ổn áp 3,3V cần thiết cho
800 mA hiện tại và bộ chuyển đổi sang CH340G UART-USB.

Trước hết, bộ đếm giờ hoạt động được tạo ra là bộ đếm cập nhật nhất. Các đồng hồ đo công nghiệp đã qua sử dụng trước đây được lắp ráp trên PIC với mạch cấp nguồn không dùng máy biến áp bị hỏng do tăng điện áp trong vòng một năm hoạt động. Chỉ những thiết bị được kết nối bằng nguồn điện 5V tự chế vẫn còn nguyên vẹn. Để tăng tốc độ cài đặt và tính linh hoạt của kết nối, tín hiệu về trạng thái của các thiết bị được lấy từ các đầu cuối của thiết bị chuyển mạch, tức là. đăng ký sự hiện diện của điện áp pha 1 với nguồn điện ba pha 380V. Để phối hợp với bộ điều khiển, người ta sử dụng rơle trung gian có cuộn dây 220V hoặc bộ ghép quang gồm đèn LED và điện trở quang GL5516 hoặc bộ ghép quang PC817. Tất cả các lựa chọn đã được thử nghiệm. Đèn LED được cấp nguồn bằng điện áp chỉnh lưu có giới hạn dòng điện sử dụng hai tụ điện SVV22 được thiết kế cho điện áp 630V được mắc nối tiếp để đảm bảo an toàn trong quá trình kiểm tra ngẫu nhiên các mạch bằng megohm kế.
Đọc chỉ số thời gian hoạt động bằng màn hình LCD ST7735S, truyền dữ liệu thời gian thực qua radio sử dụng module E01-ML01DP05 ở tần số 2,4 MHz. Thiết bị này chứa chip nRF24L01+ và bộ khuếch đại truyền/thu RFX2401C,
công suất đầu ra lên tới 100 mW. Ăng-ten xoắn ốc được thiết kế cho phạm vi mong muốn trong máy tính trực tuyến сайта. Việc lựa chọn loại ăng-ten được xác định bằng cách loại trừ việc thu sóng phản xạ đơn lẻ từ các cấu trúc kim loại xung quanh. Các bộ phận của ăng-ten được in trên máy in 3D. Trạng thái hiện tại của bộ đếm được lưu trữ trong EEPROM của chính bộ điều khiển và được khôi phục trong trường hợp mất điện đột xuất. Khoảng thời gian đếm được cung cấp bởi chip RTC DS3231 dưới dạng mô-đun có pin dự phòng. Bộ nguồn sử dụng 3 module, nguồn xung thực tế 220/5V HLK-PM01 600mA, bộ chuyển đổi từ 1-5V sang 5V HW-553 и 03962A - Bộ điều khiển pin với cơ chế bảo vệ chống ngắn mạch, quá tải và quá tải. Tất cả các thành phần đã được mua trên trang web Aliexpress.

Bảng bánh mìHệ thống thu thập dữ liệu tự trị cục bộ
bộ đếm 4 kênh. Có các bộ lọc LC ở đầu vào để bảo vệ chống nhiễu trên đường truyền đôi xoắn. Dữ liệu về trạng thái của đối tượng điều khiển được đọc liên tục mỗi giây một lần và hiển thị màu trên màn hình LCD. Các bài đọc được cập nhật và ghi lại vào bộ nhớ cố định cứ sau 1 giây. 36 giây là 36/1 của một giờ, đây là định dạng bắt buộc phải có dữ liệu. Cứ sau 100 giây. thông tin được truyền đi về số giây hoạt động của mỗi bộ điều khiển. Theo nhà sản xuất, bộ nhớ EEPROM có số chu kỳ ghi-xóa giới hạn là 12 lần. Tùy chọn tồi tệ nhất là khi có ít nhất một ô liên tục được cập nhật. Âm lượng của bộ đếm thứ 100000 là 1 byte, đây là số định dạng dài, 4 bộ đếm, tổng cộng 4 byte được chiếm bởi một bản ghi. Độ dài bộ nhớ của chip là 16 byte, sau 1024 mục của 64 bộ đếm, quá trình ghi sẽ bắt đầu lại. Trong thư viện EEPROM, phương thức EEPROM.put không ghi, nếu giá trị của ô và thông tin được ghi khớp nhau thì các ô sẽ không bị suy giảm. Nhờ đó, thời gian hoạt động của bộ nhớ được đảm bảo sẽ hơn 4 năm. Thời gian làm việc có thể nhưng không đảm bảo có thể dài hơn nhiều.

Sơ đồ mạchHệ thống thu thập dữ liệu tự trị cục bộ
Lập trình trong Arduino IDE//12 byte (328%)

#bao gồm // Thư viện đồ họa lõi
#bao gồm // Thư viện dành riêng cho phần cứng
#include
#bao gồm
#include
#bao gồm
#bao gồm
đài RF24(9, 10); // đối tượng radio để làm việc với thư viện RF24,
// và số pin nRF24L01+ (CE, CSN)
#bao gồm
DS3231 rtc(SDA, SCL);
Thời gian t;

//#xác định TFT_CS 10
#xác định TFT_CS 8
#define TFT_RST -1 // bạn cũng có thể kết nối cái này với thiết lập lại Arduino
// trong trường hợp đó, hãy đặt mã pin #define này thành -1!
//#define TFT_DC 9 // DC=RS=A0 - tùy chọn chỉ định để chọn lệnh hoặc thanh ghi dữ liệu.
#xác định TFT_DC 3

Adafbean_ST7735 tft = Adafbean_ST7735(TFT_CS, TFT_DC, TFT_RST);

// Cách 2: sử dụng bất kỳ chân nào nhưng chậm hơn một chút!
#define TFT_SCLK 13 // đặt chúng thành bất kỳ chân nào bạn thích!
#define TFT_MOSI 11 // đặt chúng thành bất kỳ chân nào bạn thích!
// Adaf nhung_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#bao gồm

dịch chuyển byte = 52;
byte pinState;
bơm dài không dấu [4];// mảng có giá trị bộ đếm 4 giây
phao m = 3600.0;
địa chỉ int không dấu = 0;
int rc;// biến cho bộ đếm
tổng dài không dấu = 0;
sumsec dài không dấu = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
máy đếm byte[4]; // mảng lưu trữ trạng thái đối tượng, 1 - tắt, 0 - bật.
int bắt đầu = 0; //

void setup () {

rtc.begin();
radio.begin(); // Bắt đầu công việc nRF24L01+
radio.setChannel(120); // kênh dữ liệu (từ 0 đến 127).
radio.setDataRate(RF24_250KBPS); // tốc độ truyền dữ liệu (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // công suất phát (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Mở một pipe có mã định danh để truyền dữ liệu

// Để đặt thời gian, bỏ ghi chú các dòng cần thiết
//rtc.setDOW(1); // Ngày trong tuần
//rtc.setTime(21, 20, 0); // Thời gian, ở định dạng 24 giờ.
//rtc.setDate(29, 10, 2018); // Ngày, 29 tháng 2018 năm XNUMX

tft.initR(INITR_BLACKTAB); // khởi tạo chip ST7735S, tab màu đen
// Sử dụng trình khởi tạo này (không ghi chú) nếu bạn đang sử dụng màn hình LCD 1.44"
//tft.initR(INITR_144GREENTAB); // khởi tạo chip ST7735S, tab RCB ĐỎ
tft.setTextWrap(sai); // Cho phép văn bản chạy ngoài lề phải
tft.setRotation( 2 ); // cho PCB ĐEN và ĐỎ tft.setRotation(0) hay không.
tft.fillScreen(ST7735_BLACK); // xóa màn hình

DDRD = DDRD | B00000000;
CỔNG = CỔNG | B11110000; // thắt chặt phần mềm đang hoạt động, mức cao -
// các đối tượng được điều khiển “không hoạt động”, “4” được ghi vào cả 1 cổng cao cấp D, không xảy ra đếm.

vì (rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // hiển thị số vị trí của đối tượng điều khiển
tft.print(rc + 1);
}

tft.setCursor(12, 0); // xuất ra 3 dòng văn bản
tft.println("NHÀ PHÁT TRIỂN & XÂY DỰNG"); // để khen ngợi chính mình những người thân yêu
tft.setCursor(24, 10); // hay bản quyền ác độc
tft.print("PHÁT TRIỂN MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//phục hồi dữ liệu////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Lặp qua tất cả các ô của ngành
// và ghi vào một mảng gồm 4 biến bơm, 4 byte cho mỗi bộ đếm, bởi vì
// biến dài không dấu. Có 4 bộ đếm, một bản ghi của cả 4 bộ đếm đều có dung lượng 16 byte.
EEPROM.get(z, bơm[0]); // vì vậy, không có vòng lặp for, âm lượng sẽ ít hơn
EEPROM.get(z+4, bơm[1]);
EEPROM.get(z+8, bơm[2]);
EEPROM.get(z+12, bơm[3]);

// gán giá trị tiếp theo mới cho tổng 4 bộ đếm
sumprim = (bơm [0] + bơm [1] + bơm [2] + bơm [3]);

// so sánh giá trị mới của tổng 4 bộ đếm trong biến sumprim với giá trị trước đó trong biến
// sumsec và nếu tổng trước đó nhỏ hơn hoặc bằng tổng mới thì giá trị mới lớn hơn hoặc bằng mới sẽ được gán
// giá trị sumsec.

nếu ( sumsec <= sumprim ) {
sumsec = sumprim; //

// và giá trị hiện tại z được gán cho biến địa chỉ, z là địa chỉ bắt đầu của khối 16 byte gồm 4 giá trị
// các bộ đếm được ghi cùng lúc (vì khi thăm dò một cổng, tất cả 8 bit của nó được ghi đồng thời,
// bao gồm 4 bit cao cần thiết của cổng D).
địa chỉ = z;
}
}

// một lần nữa truy cập vào bộ nhớ eeprom tại địa chỉ đầu khối 16 byte gồm 4 giá trị bộ đếm được ghi
// cuối cùng, tức là giá trị trước khi tắt hoặc khởi động lại do bị treo. Ghi âm mới nhất
// truy cập các giá trị vào một mảng 4 biến bơm.

EEPROM.get(địa chỉ, bơm[0]);
EEPROM.get(địa chỉ + 4, bơm[1]);
EEPROM.get(địa chỉ + 8, bơm[2]);
EEPROM.get(địa chỉ + 12, bơm[3]);

địa chỉ += 16; // tăng địa chỉ để ghi khối tiếp theo mà không ghi đè dữ liệu của bản ghi cuối cùng

//kết thúc quá trình khôi phục dữ liệu////////////////////////////////////////////////////////// ///////////////////

AttachInterrupt(0, count, RISING); // ghim D2, cho phép ngắt, đến sau mỗi giây
// xung từ RTC DS3231 từ đầu ra SQW

wdt_enable(WDTO_8S); // khởi động bộ đếm thời gian theo dõi, khởi động lại bộ điều khiển trong trường hợp đóng băng, thời gian,
// mà bạn cần đưa ra lệnh đặt lại bộ hẹn giờ wdt_reset( và tránh khởi động lại trong khi hoạt động bình thường - 8 giây.
// đối với các bài kiểm tra, không nên đặt giá trị dưới 8 giây. Trong trường hợp này, tốt nhất nên đặt lại bộ hẹn giờ
// giật, và nó xảy ra mỗi giây.

}

void loop () {
// chu trình rỗng, ở đây sẽ điều khiển hoạt động pha hở của động cơ điện
}

số lượng khoảng trống () {

tft.setTextColor(ST7735_WHITE); // thiết lập màu chữ
t = rtc.getTime(); // thơi gian đọc
tft.setCursor(5, 120); // thiết lập vị trí con trỏ
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // xóa vùng đầu ra thời gian
tft.print(rtc.getTimeStr()); // xuất số liệu đồng hồ

wdt_reset(); // đặt lại cơ quan giám sát mỗi chu kỳ, tức là giây

for (rc = 0; rc < 4; rc ++) // bắt đầu chu trình kiểm tra sự tuân thủ của trạng thái đầu vào
// chuyển các bit sang trạng thái đọc trước đó của các bit cổng D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // và nếu không khớp thì
pumrcounter[rc] = pinState; // gán cho biến trạng thái bit cổng một giá trị mới 1/0
}
// chỉ báo trạng thái của các đối tượng điều khiển màu
// BLUE là một trục trặc nhỏ của màn hình hiện có (hoặc thư viện?), RGB và BGR bị lẫn lộn.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // để đếm mức độ thấp, thay đổi XANH thành XANH
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // để đếm ở mức độ thấp, thay đổi BLUE thành GREEN
bơm [rc] += 1; // thêm 1 giây vào bộ đếm thời gian hoạt động
}
}

k++;
nếu (k == 36) {
k = 0;

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // xóa vùng hiển thị thời gian hoạt động
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // và ngày tháng

tft.setCursor(60, 120); // thiết lập vị trí con trỏ
tft.print(rtc.getDateStr()); // hiển thị ngày tháng trên màn hình LCD

for (rc = 0; rc < 4; rc ++) // xuất ra toàn bộ số giờ hoạt động, phần mười và
{
tft.setCursor ( 30, rc * 10 + shift ); // phần trăm giờ với màn hình dịch chuyển xuống 10 pixel
tft.println(bơm [rc] / m);
}

// ghi các giá trị giờ hoạt động “thô” (tính bằng giây) vào EEPROM //////////////////////////////

cho (rc = 0; RC < 4; RC++)
{
EEPROM.put(địa chỉ, máy bơm [rc]);
địa chỉ += sizeof(float); // tăng biến địa chỉ ghi
}
}

// gửi dữ liệu qua kênh radio từ dữ liệu cho biết số byte sẽ được gửi.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

dữ liệu dài không dấu;

radio.write(&start, sizeof(start));

vì (i = 0; i < 4; i++) {
dữ liệu = bơm [i];
radio.write( &data, sizeof(data));
}
}
}

Một vài lưu ý ở cuối. Việc đếm xảy ra ở mức logic thấp ở đầu vào.

Điện trở kéo lên R2-R5 là 36 kOhm đối với tùy chọn với điện trở quang GL5516. Trong trường hợp bộ ghép quang và rơle phototransistor, được đặt thành 4,7-5,1 kOhm. Bộ tải khởi động Arduino Nano v3.0 đã được thay thế bằng Arduino Uno sử dụng bộ lập trình TL866A để vận hành chính xác bộ đếm thời gian theo dõi. Cầu chì được điều chỉnh để hoạt động ở điện áp trên 4,3 V. Mạch đặt lại bên ngoài R6 C3 không được sử dụng. Trong chương trình ví dụ, tần số máy phát không tương ứng với dải không được cấp phép; dải 2,4 MHz được giới hạn ở tần số 2400.0-2483.5 MHz.

Phạm vi của máy phát E01-ML01DP05 là 2400-2525 MHz. Băng thông của một kênh là 1 MHz, khi cài đặt tốc độ là “RF24_2MBPS”, kênh radio.setChannel(120) được chỉ định và kênh tiếp theo sẽ bị chiếm, tức là. băng tần sẽ là 2 MHz.

Nguồn: www.habr.com

Thêm một lời nhận xét