Орон нутгийн бие даасан мэдээлэл цуглуулах систем

Тус компани нь Next Technologies-ийн дотоодод үйлдвэрлэсэн NEKST-M хяналтын тулгууруудыг худалдан авсан. Ус шахах нэгжийн ажиллагааг дүрслэн харуулахын тулд
галын болон хамгаалалтын дохиолол, асаагуурт хүчдэл байгаа эсэх, өрөөний температур, яаралтай усны түвшин. NEKST-M-ийн зүрх нь ATMEGA 1280 бөгөөд энэ нь тодорхой хэрэгцээнд зориулж өөрийн иж бүрдлийг бий болгох боломжийн хувьд урам зориг өгдөг.

Тодорхой хэрэгцээнд зориулан аль болох богино хугацаанд, хамгийн бага зардлаар бүрэн бие даасан орон нутгийн диспетчерийн системийг бий болгох зорилт тавьсан. Үүний үндэс нь микроконтроллер юм. Хөгжил, үйлдвэрлэл, ажилтнууд өөрсдөө бий болгосон.

Систем нь үүрэн сүлжээ, сервер, интернет, радио давтамжийн нөөц ашиглах лицензийн системээс хамааралгүйгээр ажиллах ёстой, хяналт, хяналтын системийн үйл ажиллагаанд компьютер ашиглахгүй байх, эсвэл дээд тал нь зөөврийн компьютерийг үе үе ашиглахгүй байх ёстой. объектууд удаан хугацаагаар (6-9 сар). Сүлжээний тохиргоо нь радиаль бүтэцтэй. Мэдээллийг нэг цэгт цуглуулж, дараа нь ердийн холбооны сувгаар эсвэл цаасан хэлбэрээр боловсруулахаар илгээдэг.

Систем нь дараахь зүйлийг хангах ёстой.

  • шахуургын нэгжийн ажиллагааг хянах
  • технологийн автоматжуулалт
  • онцгой байдлын нөхцөл байдлын үр дагавраас хамгаалах
  • яаралтай дохиолол
  • ажиллах цагийн тооцоо
  • хэрэглэсэн цахилгаан эрчим хүчний хэмжээг тооцоолох
  • тоног төхөөрөмжийн температурын хяналт
  • аюулгүй байдал, галын дохиолол
  • мэдээллийг үе үе алсаас бүртгэх
  • тодорхойгүй ирээдүйн шаардлага

Ажлын байрны нөхцөл:

  • хамрах хүрээ 1 кв.км.
  • объектуудын хооронд шууд харагдах байдал
  • температур +50-аас -50 С хүртэл
  • чийгшил 100% хүртэл
  • биологийн идэвхит ордууд (хөгц, сульфат бууруулах бактери)
  • ГОСТ ISO 1-2-10816 стандартын дагуу 1-97-р ангиллын машинуудын чичиргээ, илүү байхгүй
  • цахилгаан соронзон орчин - KT 6053 контактор бүхий цахилгаан мотор, RVS-DN зөөлөн асаалтын төхөөрөмж, SIEMENS MICROMASTER PID хяналтын төхөөрөмж, эдгээр төхөөрөмжид тавигдах шаардлагын дагуу ISM болон GSM хүрээн дэх цацраг, газар дээр нь гараар нуман гагнуур хийх.
  • 6-10 кВ-ын хуваарилах сүлжээнд агаарын шугамын утас тасрах үед сүлжээний хэт хүчдэл, цахилгаан хангамжийн богино хугацааны тасалдал, аянгын хэт хүчдэл, фазын тэнцвэргүй байдал.

Ийм хатуу шаардлагыг үл харгалзан асуудлыг алхам алхмаар шийдвэрлэхэд хэрэгжилт нь маш энгийн байдаг.

Бүх зүйлийг харгалзан үзэхэд "Arduino Nano 3.0" самбар нь төлөвлөгөөний "тархи" болсон. Robotdyn самбар нь ATMEGA 328 хянагчтай, шаардлагатай 3,3V хүчдэлийн тогтворжуулагчтай.
одоогийн 800 мА ба хөрвүүлэгч CH340G UART-USB.

Юуны өмнө ажлын цагийн тоолуурыг хамгийн сүүлийн үеийн тоогоор бий болгосон. Трансформаторгүй цахилгаан хангамжийн хэлхээ бүхий PIC дээр угсарсан өмнө нь ашиглаж байсан үйлдвэрлэлийн тоолуурууд ашиглалтад орсноос хойш нэг жилийн дотор хүчдэлийн өсөлтөөс болж бүтэлгүйтсэн. Зөвхөн гар хийцийн 5V цахилгаан хангамжийг ашиглан холбогдсон хүмүүс хэвээр үлджээ. Суурилуулалт, холболтын олон талт байдлыг хурдасгахын тулд шилжүүлэгч төхөөрөмжүүдийн терминалуудаас нэгжийн төлөв байдлын талаархи дохиог авдаг. 1 В-ын гурван фазын цахилгаан хангамжтай 380-р фазын хүчдэл байгаа эсэхийг бүртгэх. Хянагчтай зохицуулахын тулд 220 В ороомогтой завсрын реле эсвэл LED ба GL5516 фоторезистор эсвэл PC817 оптокоуплерээс бүрдсэн оптокоуплер ашигладаг. Бүх сонголтыг туршиж үзсэн. LED нь хэлхээг мегаомметрээр санамсаргүй турших үед аюулгүй байдлыг хангах үүднээс цувралаар холбогдсон 22В хүчдэлд зориулагдсан хоёр SVV630 конденсаторыг ашиглан одоогийн хязгаарлалттай шулуутгагдсан хүчдэлээр тэжээгддэг.
ST7735S LCD дэлгэц ашиглан үйлдлийн цагийн уншилтыг унших, 01 МГц давтамжтайгаар E01-ML05DP2,4 модулийг ашиглан радиогоор бодит цагийн өгөгдөл дамжуулах. Энэ төхөөрөмж нь nRF24L01+ чип болон RFX2401C дамжуулах/хүлээн авах өсгөгч,
гаралтын чадал 100 мВт хүртэл. Онлайн тооцоолуур дээр хүссэн мужид зориулагдсан мушгиа антеннууд сайт. Антенны төрлийг сонгохдоо эргэн тойрны металл байгууламжаас туссан долгионыг хүлээн авахгүй байх замаар тодорхойлно. Антенны эд ангиудыг 3D принтер дээр хэвлэдэг. Тоолууруудын одоогийн төлөвийг хянагчийн EEPROM-д хадгалдаг бөгөөд гэнэтийн цахилгаан тасалдсан тохиолдолд сэргээгддэг. Тоолох хугацааны интервалыг RTC чип DS3231 нөөц батарейтай модуль хэлбэрээр өгдөг. Цахилгаан хангамж нь 3 модуль, бодит импульсийн эх үүсвэр 220/5V HLK-PM01 600mA, 1-5V-ээс 5V хүртэл хувиргагчийг ашигладаг. ДЦ-553 и 03962A - батерейны хянагчтай схем богино холболт, хэт цэнэг, хэт цэнэглэлтээс хамгаалах. Бүх бүрэлдэхүүн хэсгүүдийг Aliexpress вэбсайтаас худалдаж авсан.

Талхны хавтанОрон нутгийн бие даасан мэдээлэл цуглуулах систем
4 сувгийн тоолуур. Эрчилсэн хос холбооны шугамаар хөндлөнгөөс оролцохоос хамгаалахын тулд оролтууд дээр LC шүүлтүүрүүд байдаг. Хяналтын объектын төлөв байдлын талаарх мэдээллийг секундэд нэг удаа тогтмол уншиж, LCD дэлгэц дээр өнгөөр ​​харуулдаг. Уншлагыг 1 секунд тутамд шинэчилж, тогтворгүй санах ойд бүртгэдэг. 36 секунд нь цагийн 36/1, энэ нь өгөгдөл шаардлагатай формат юм. 100 секунд тутамд. Хяналтын нэгж бүрийн ажиллах секундын талаарх мэдээллийг дамжуулдаг. EEPROM санах ой нь үйлдвэрлэгчийн мэдээлснээр 12 удаа бичих, устгах цөөн тооны циклтэй байдаг. Хамгийн муу сонголт бол дор хаяж нэг нүд байнга шинэчлэгдэж байх явдал юм. 100000-р тоолуурын эзэлхүүн нь 1 байт, энэ нь урт форматтай дугаар, 4 тоолуур, нийт 4 байт нэг бичлэг эзэлдэг. Чипийн санах ойн урт нь 16 байт бөгөөд 1024 тоолуурын 64 оруулгын дараа бичлэг дахин эхэлнэ. EEPROM номын санд EEPROM.put арга бичихгүй, хэрэв нүдний утга болон бичиж буй мэдээлэл таарч байвал нүднүүдийн доройтол байхгүй болно. Үүний үр дүнд санах ойн баталгаатай ажиллах хугацаа 4 жилээс илүү байх болно. Боломжтой боловч баталгаагүй ажлын хугацаа илүү урт байж болно.

Хэлхээний диаграмОрон нутгийн бие даасан мэдээлэл цуглуулах систем
Arduino IDE дээрх програм//12 байт (328%)

#оруулна // Үндсэн график номын сан
#оруулна // Техник хангамжийн тусгай номын сан
# оруулах
#оруулна
# оруулах
#оруулна
#оруулна
RF24 радио(9, 10); // RF24 номын сантай ажиллах радио объект,
// ба зүү дугаар nRF24L01+ (CE, CSN)
#оруулна
DS3231 rtc(SDA, SCL);
Цаг t;

//#TFT_CS 10-г тодорхойлох
#TFT_CS 8-г тодорхойлох
#define TFT_RST -1 // та үүнийг Arduino-г дахин тохируулахад холбож болно
// энэ тохиолдолд #define зүүг -1 болгож тохируулна уу!
//#define TFT_DC 9 // DC=RS=A0 - команд эсвэл өгөгдлийн бүртгэлийг сонгох зориулалтын сонголтууд.
#TFT_DC 3-г тодорхойлох

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

// Сонголт 2: дурын зүү ашиглана уу, гэхдээ арай удаан!
#define TFT_SCLK 13 // эдгээрийг дуртай тээглүүр болгон тохируулаарай!
#define TFT_MOSI 11 // эдгээрийг хүссэн зүүгээр нь тохируулаарай!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#оруулна

байт шилжих = 52;
байт pinState;
unsigned long pump[4];// 4 секундын тоолуурын утга бүхий массив
хөвөх м = 3600.0;
гарын үсэг зураагүй int хаяг = 0;
int rc;// тоолуурын хувьсагч
unsigned long sumprim = 0;
гарын үсэггүй урт сумсек = 0;
байт i = 0;
байт k = 34;
unsigned int z = 0;
байт b = B00000001;
byte pumrcounter[4]; // объектын төлөвийг хадгалах массив, 1 - унтраалттай, 0 - асаалттай.
int эхлэл = 0; //

хүчингүй тохиргоо () {

rtc.begin();
radio.begin(); // nRF24L01+ ажлыг эхлүүлэх
radio.setChannel(120); // өгөгдлийн суваг (0-ээс 127 хүртэл).
radio.setDataRate(RF24_250KBPS); // өгөгдөл дамжуулах хурд (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // дамжуулагчийн хүч (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Өгөгдөл дамжуулах таних тэмдэг бүхий хоолойг нээнэ

// Цагийг тохируулахын тулд шаардлагатай мөрүүдийн тайлбарыг арилгана уу
//rtc.setDOW(1); // Долоо хоногийн өдөр
//rtc.setTime(21, 20, 0); // Цаг, 24 цагийн форматаар.
//rtc.setDate(29, 10, 2018); // Огноо, 29 оны 2018-р сарын XNUMX

tft.initR(INITR_BLACKTAB); // ST7735S чипийг эхлүүлэх, хар таб
// Хэрэв та 1.44" TFT ашиглаж байгаа бол энэ эхлүүлэгчийг (тайлбарыг арилгах) ашиглана уу
//tft.initR(INITR_144GREENTAB); // ST7735S чип, RED rcB табыг эхлүүлнэ үү
tft.setTextWrap(худал); // Текстийг баруун захаас гаргахыг зөвшөөрнө үү
tft.setRotation( 2 ); // ХАР ПХБ болон RED tft.setRotation(0)-д зориулагдсан эсвэл үгүй.
tft.fillScreen(ST7735_BLACK); // тодорхой дэлгэц

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // програм хангамжийг чангалж байна, өндөр түвшин -
// удирдлагатай объектууд "ажиллахгүй", "4" гэж бүх 1 ахлах D порт руу бичнэ, тоолохгүй.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + шилжилт); // хяналтын объектуудын байрлалын дугаарыг харуулах
tft.print(rc + 1);
}

tft.setCursor(12, 0); // 3 мөр текст гаргана
tft.println("ХӨГЖҮҮЛЭГЧДИЙН БА БҮТЭЭГДЭХҮҮН"); // хайртай хүмүүсээ өөрийгөө магтах
tft.setCursor(24, 10); // эсвэл муу зохиогчийн эрх
tft.print("ХӨГЖҮҮЛЭГЧ MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//мэдээлэл сэргээх/////////////////////////////////////////////////////// ////////////

for ( z = 0; z < 1023; z += 16 ) { // Салбарын бүх нүдээр давтагдана
//болон тоологч тус бүрд 4 байт, 4 шахуургын хувьсагчийн массив руу бичдэг, учир нь
// тэмдэггүй урт хувьсагч. 4 тоолуур байдаг бөгөөд 4-ийн нэг бичлэг нь 16 байт байна.
EEPROM.get(z, насос[0]); // тэгэхээр for давталтгүй бол эзлэхүүн бага
EEPROM.get(z+4, насос[1]);
EEPROM.get(z+8, насос[2]);
EEPROM.get(z+12, насос[3]);

// 4 тоолуурын нийлбэрт дараагийн шинэ утгыг оноож байна
sumprim = (насос [0] + насос [1] + насос [2] + насос [3]);

// sumprim хувьсагчийн 4 тоолуурын нийлбэрийн шинэ утгыг хувьсагчийн өмнөх утгатай харьцуулна.
// sumsek ба өмнөх нийлбэр нь шинэ нийлбэрээс бага эсвэл тэнцүү бол шинэ их буюу тэнцүү нийлбэрийг онооно.
// sumsek утга.

хэрэв (sumsec <= sumprim ) {
sumsek = sumprim; //

//болон одоогийн z утга нь хаягийн хувьсагчид оноогдсон, z нь 16 утга бүхий 4 байт блокийн эхлэлийн хаяг юм.
// тоолуурыг нэгэн зэрэг бүртгэсэн (учир нь портыг санал хураах үед түүний бүх 8 битийг нэгэн зэрэг бичдэг,
// үүнд шаардлагатай өндөр 4 бит порт D).
хаяг = z;
}
}

// 16 бүртгэгдсэн тоологч утгын 4 байт блокийн эхлэлийн хаяг дахь eeprom санах ой руу дахин хандах
// сүүлчийн, өөрөөр хэлбэл. хөлдсөний улмаас унтрах эсвэл дахин ачаалахаас өмнөх утгууд. Хамгийн сүүлийн үеийн бичлэг хийж байна
// 4 хувьсагчийн массив руу утгыг тоолох.

EEPROM.get(хаяг, насос[0]);
EEPROM.get(хаяг + 4, насос[1]);
EEPROM.get(хаяг + 8, насос[2]);
EEPROM.get(хаяг + 12, насос[3]);

хаяг += 16; //сүүлийн бичлэгийн өгөгдлийг дарж бичихгүйгээр дараагийн блок бичих хаягийг нэмэгдүүлэх

//мэдээлэл сэргээх төгсгөл////////////////////////////////////////// //////////////////

attachInterrupt(0, тоо, RISING); // D2 зүү, тасалдлыг идэвхжүүл, секунд тутамд ирдэг
// SQW гаралтаас RTC DS3231-ээс импульс

wdt_enable(WDTO_8S); // харуулын цаг хэмжигчийг эхлүүлэх, хөлдсөн тохиолдолд хянагчийг дахин ачаалах, цаг хугацаа,
// үүний тулд та wdt_reset цаг хэмжигчийг дахин тохируулах командыг өгөх шаардлагатай бөгөөд хэвийн ажиллагааны үед дахин ачаалахаас зайлсхийх хэрэгтэй - 8 сек.
// Туршилтын хувьд утгыг 8 секундээс бага байлгахыг зөвлөдөггүй. Энэ тохиолдолд таймерыг дахин тохируулах нь дээр.
// Jerking, энэ нь секунд тутамд тохиолддог.

}

хүчингүй гогцоо () {
// хоосон мөчлөг, энд цахилгаан моторын нээлттэй фазын ажиллагааг хянах болно
}

хүчингүй тоо () {

tft.setTextColor(ST7735_WHITE); // үсгийн өнгийг тохируулах
t = rtc.getTime(); // унших цаг
tft.setCursor(5, 120); // курсорын байрлалыг тохируулах
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // цаг гаралтын хэсгийг цэвэрлэх
tft.print(rtc.getTimeStr()); // гаралтын цагийн уншилт

wdt_reset(); // манаачийг мөчлөг бүрт, өөрөөр хэлбэл секундэд дахин тохируулна

for (rc = 0; rc < 4; rc ++) // оролтын төлөвийн нийцлийг шалгах мөчлөгийн эхлэл
// портын битүүдийг D портын өмнөх уншигдах төлөв рүү оруулна
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // ба таарахгүй бол
pumrcounter[rc] = pinState; // портын битийн төлөвийн хувьсагчид 1/0 шинэ утгыг оноож байна
}
// өнгөний хяналтын объектын төлөвийн заалт
// BLUE бол одоо байгаа дэлгэцийн жижиг алдаа (эсвэл номын сангийн?), RGB болон BGR холилдсон байна.
хэрэв (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + ээлж)), 7, 7, ST7735_BLUE); // доод түвшний тоолох бол НОГООН өнгийг ЦЭНХЭР болгон өөрчил
} else {
tft.fillRect(15, ((rc * 10 + ээлж)), 7, 7, ST7735_GREEN); // бага түвшний тоолох бол ЦЭНХЭР-г НОГООН болгож өөрчил
насос [rc] += 1; // ажиллах цагийн тоолуурт 1 секунд нэмнэ
}
}

k++;
хэрэв (k == 36) {
k = 0;

tft.fillRect(30, ээлж, 97, 40, ST7735_BLACK); // үйл ажиллагааны цагийг харуулах хэсгийг цэвэрлэх
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // ба огноо

tft.setCursor(60, 120); // курсорын байрлалыг тохируулах
tft.print(rtc.getDateStr()); // LCD дэлгэц дээр огноог харуулах

for (rc = 0; rc < 4; rc ++) //ажлын цагийг бүхэлд нь, аравны нэг болон гаргана.
{
tft.setCursor ( 30, rc * 10 + шилжилт ); // дэлгэцийн шилжилтийг 10 пикселээр доошлуулсан цагийн зууны нэг хэсэг
tft.println(насос [rc] / м);
}

// "түүхий" ажлын цагийн утгыг (секундэд) EEPROM руу бичих ///////////////////////////////////////

хувьд (rc = 0; rc < 4; rc++)
{
EEPROM.put(хаяг, насос [rc]);
хаяг += sizeof(хөвөгч); // бичих хаягийн хувьсагчийг нэмэгдүүлнэ
}
}

// хэдэн байт илгээх ёстойг харуулсан өгөгдлөөс радио сувгаар өгөгдөл илгээнэ.
хэрэв ((k == 6 ) || (k == 18 ) || (k == 30 )) {

гарын үсэг зураагүй урт өгөгдөл;

radio.write(&эхлэх, sizeof(эхлэх));

хувьд (i = 0; i < 4; i++) {
өгөгдөл = насос [i ];
radio.write( &өгөгдөл, sizeof(өгөгдөл));
}
}
}

Төгсгөлд нь хэдэн тэмдэглэл. Тоолох нь оролтод логик бага түвшинд явагддаг.

R2-R5 татах эсэргүүцэл нь GL36 фоторезистортой сонголтын хувьд 5516 кОм байна. Фототранзисторын оптокоуплер ба релений хувьд 4,7-5,1 кОм хүртэл тохируулна. Watchdog таймерыг зөв ажиллуулахын тулд Arduino Nano v3.0 ачаалагчийг TL866A программист ашиглан Arduino Uno-оор сольсон. Гал хамгаалагчийг 4,3 В-оос дээш хүчдэлд ажиллуулахаар зассан. Гадаад дахин тохируулах R6 C3 хэлхээг ашиглаагүй. Түүврийн программд дамжуулагчийн давтамж нь зөвшөөрөлгүй мужид тохирохгүй, 2,4 МГц-ийн хүрээ нь 2400.0-2483.5 МГц давтамжаар хязгаарлагддаг.

E01-ML01DP05 дамжуулагчийн хүрээ нь 2400-2525 МГц байна. Нэг сувгийн зурвасын өргөн нь 1 МГц, хурдыг "RF24_2MBPS" гэж тохируулах үед заасан radio.setChannel(120) суваг, дараагийнх нь ажиллах болно, өөрөөр хэлбэл. зурвас нь 2 МГц байх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх