Yerel Otonom Veri Toplama Sistemi

Şirket, Next Technologies tarafından yurt içinde üretilen NEKST-M izleme direklerini satın aldı. Pompalama ünitelerinin çalışmasının görselleştirilmesini sağlamak,
yangın ve güvenlik alarmları, marş motorlarında voltaj varlığı, oda sıcaklığı, acil su seviyesi. NEKST-M'nin kalbi ATMEGA 1280'dir ve bu gerçek, özel ihtiyaçlar için kendi kitinizi oluşturma imkanı açısından cesaret vericidir.

Görev, belirli ihtiyaçlar için mümkün olan en kısa sürede ve minimum maliyetle tamamen özerk bir yerel sevk sistemi oluşturmaktı. Temel bir mikrodenetleyicidir. Geliştirme, üretim, personelin kendisi tarafından yaratılmıştır.

Sistem, hücresel ağlara, sunuculara, internete ve radyo frekans kaynaklarının kullanımına ilişkin lisanslama sistemine bağımlı olmadan çalışmalı, izleme ve kontrol sisteminin işleyişinde bilgisayar kullanılmamalı veya en fazla periyodik olarak dizüstü bilgisayarlar kullanılmamalı, erişim sağlanmamalıdır. nesneleri uzun süre (6-9 ay) tutmayın. Ağ konfigürasyonu radyal bir yapıya sahiptir. Veriler bir noktada toplanır ve ardından normal iletişim kanalları aracılığıyla veya basılı kopya olarak işlenmek üzere gönderilir.

Sistem şunları sağlamalıdır:

  • pompalama ünitelerinin çalışmasının izlenmesi
  • teknolojik otomasyon
  • acil durumların sonuçlarından korunma
  • acil durum sinyali
  • çalışma süresi hesaplaması
  • tüketilen elektrik miktarının hesaplanması
  • ekipman sıcaklık kontrolü
  • güvenlik ve yangın alarmı
  • bilgilerin periyodik olarak uzaktan kaydedilmesi
  • bilinmeyen gelecekteki gereksinimler

Çalışma şartları:

  • kapsama alanı 1 metrekare km.
  • nesneler arasında doğrudan görünürlük
  • +50 ila -50 C arası sıcaklık
  • %100'e kadar nem
  • biyolojik olarak aktif birikintiler (küf, sülfat azaltıcı bakteriler)
  • GOST ISO 1-2-10816'ye göre sınıf 1-97 makinelerin titreşimi artık yok
  • elektromanyetik ortam - KT 6053 kontaktörlerle elektrik motorlarının anahtarlanması, RVS-DN yumuşak başlatma ekipmanı, SIEMENS MICROMASTER PID kontrol ekipmanı, bu cihazların gereksinimlerine göre ISM ve GSM aralığında radyasyon, sahada manuel ark kaynağı
  • 6-10 kV dağıtım şebekelerinde aşırı şebeke gerilimi, güç kaynağında kısa süreli kesintiler, yıldırım aşırı gerilimleri, havai hat teli koptuğunda faz dengesizliği.

Bu kadar katı gereksinimlere rağmen, sorunu adım adım çözerken uygulama oldukça basittir.

Her şey hesaba katıldığında “Arduino Nano 3.0” kartı planın “beyni” haline geldi. Robotdyn kartı, gerekli 328V voltaj dengeleyici olan ATMEGA 3,3 denetleyiciye sahiptir.
akım 800 mA ve CH340G UART-USB'ye dönüştürücü.

Öncelikle çalışma saati sayaçları en güncel olarak oluşturuldu. Transformatörsüz güç kaynağı devresine sahip PIC'lere monte edilen daha önce kullanılmış endüstriyel sayaçlar, bir yıllık çalışma süresi içinde voltaj dalgalanmaları nedeniyle arızalandı. Yalnızca ev yapımı 5V güç kaynakları kullanılarak bağlananlar sağlam kaldı. Kurulumu ve bağlantının çok yönlülüğünü hızlandırmak için, anahtarlama cihazlarının terminallerinden ünitelerin durumu hakkında bir sinyal alınır; 1V'luk üç fazlı bir güç kaynağı ile 380. faz voltajının varlığının kaydedilmesi. Kontrolörle koordinasyon sağlamak için 220V sargılı bir ara röle veya bir LED ve bir GL5516 fotodirenç veya bir PC817 optokuplörden oluşan bir optokuplör kullanılır. Tüm seçenekler test edildi. LED, devrelerin bir megohmmetre ile kazara test edilmesi sırasında güvenlik amacıyla seri olarak bağlanan 22V voltaj için tasarlanmış iki SVV630 kapasitör kullanılarak akım sınırlamalı doğrultulmuş bir voltajla çalıştırılır.
ST7735S LCD ekranı kullanarak çalışma süresi okumalarının okunması, E01-ML01DP05 modülünü kullanarak 2,4 MHz frekansında radyo üzerinden gerçek zamanlı veri aktarımı. Bu cihaz, nRF24L01+ çipini ve RFX2401C gönderme/alma amplifikatörünü içerir.
100 mW'a kadar çıkış gücü. Çevrimiçi hesaplayıcıda istenilen aralık için tasarlanmış sarmal antenler сайта. Anten tipinin seçimi, çevredeki metal yapılardan tek tek yansıyan dalgaların alınmasının hariç tutulmasıyla belirlenir. Anten parçaları 3 boyutlu yazıcıda basılmaktadır. Sayaçların mevcut durumu kontrolörün EEPROM'una kaydedilir ve beklenmedik bir elektrik kesintisi durumunda geri yüklenir. Sayma için zaman aralıkları, yedek pilli bir modül biçimindeki RTC çipi DS3231 tarafından sağlanır. Güç kaynağı 3 modül kullanır, gerçek darbe kaynağı 220/5V HLK-PM01 600mA, 1-5V'tan 5V'a dönüştürücü HW-553 и 03962A - pil denetleyicisi ile düzen kısa devreye, aşırı deşarja ve aşırı şarja karşı koruma. Tüm bileşenler Aliexpress web sitesinden satın alındı.

ekmek tahtasıYerel Otonom Veri Toplama Sistemi
4 kanallı sayaç. Girişlerde bükümlü çift iletişim hattı üzerindeki parazitlere karşı koruma sağlamak için LC filtreleri bulunmaktadır. Kontrol nesnelerinin durumuna ilişkin veriler saniyede bir kez sürekli olarak okunur ve LCD'de renkli olarak görüntülenir. Okumalar her 1 saniyede bir güncellenir ve kalıcı belleğe kaydedilir. 36 saniye saatin 36/1'üdür, verinin gerekli olduğu format budur. Her 100 saniyede bir. Her kontrol ünitesinin çalışma saniyesi sayısı hakkında bilgi iletilir. EEPROM belleği, üreticiye göre 12 kez sınırlı sayıda yazma-silme döngüsüne sahiptir. En kötü seçenek, en az bir hücrenin sürekli olarak güncellenmesidir. 100000. sayacın hacmi 1 bayttır, bu uzun formatlı bir sayıdır, 4 sayaç, toplam 4 bayt bir kayıt tarafından işgal edilir. Çipin hafıza uzunluğu 16 byte olup, 1024 sayaçtan oluşan 64 girişten sonra kayıt yeniden başlayacaktır. EEPROM kütüphanesinde EEPROM.put yöntemi yazmaz; hücrenin değeri ile yazılan bilgi eşleşirse hücrelerde herhangi bir bozulma olmaz. Sonuç olarak, garanti edilen hafıza çalışma süresi 4 yıldan fazla olacaktır. Mümkün olan ancak garantisi olmayan işin süresi çok daha uzun olabilir.

Devre şemasıYerel Otonom Veri Toplama Sistemi
Arduino IDE'deki Program//12 bayt (%328)

#katmak // Çekirdek grafik kütüphanesi
#katmak // Donanıma özel kütüphane
#Dahil etmek
#katmak
#Dahil etmek
#katmak
#katmak
RF24 radyo(9, 10); // RF24 kütüphanesiyle çalışmak için radyo nesnesi,
// ve pin numaraları nRF24L01+ (CE, CSN)
#katmak
DS3231 rtc(SDA, SCL);
Zaman t;

//#TFT_CS 10'u tanımla
#TFT_CS 8'i tanımlayın
#define TFT_RST -1 // bunu Arduino sıfırlamaya da bağlayabilirsiniz
// bu durumda #define pinini -1 olarak ayarlayın!
//#define TFT_DC 9 // DC=RS=A0 - bir komut veya veri kaydı seçmek için atama seçenekleri.
#TFT_DC 3'ü tanımlayın

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

// Seçenek 2: Herhangi bir pini kullanın ama biraz daha yavaş!
#define TFT_SCLK 13 // bunları istediğiniz pinlere göre ayarlayın!
#define TFT_MOSI 11 // bunları istediğiniz pinlere göre ayarlayın!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#katmak

bayt kaydırma = 52;
bayt pinState;
işaretsiz uzun pompa[4];// 4 saniyelik sayaç değerlerine sahip dizi
şamandıra m = 3600.0;
imzasız int adresi = 0;
int rc;// sayaçlar için değişken
imzasız uzun özet = 0;
işaretsiz uzun sumsec = 0;
bayt i = 0;
bayt k = 34;
imzasız int z = 0;
bayt b = B00000001;
bayt pompa sayacı[4]; // nesne durumlarını depolamak için dizi, 1 - kapalı, 0 - açık.
int başlangıç ​​= 0; //

geçersiz kurulum () {

rtc.begin();
radyo.begin(); // nRF24L01+ çalışmasını başlat
radyo.setChannel(120); // veri kanalı (0'dan 127'ye kadar).
radyo.setDataRate(RF24_250KBPS); // veri aktarım hızı (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radyo.setPALevel(RF24_PA_MAX); // verici gücü (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radyo.openWritingPipe(0xAABBCCDD11LL); // Veri aktarımı için tanımlayıcı içeren bir kanal açın

// Saati ayarlamak için gerekli satırların açıklamasını kaldırın
//rtc.setDOW(1); // Haftanın günü
//rtc.setTime(21, 20, 0); // Zaman, 24 saat formatında.
//rtc.setDate(29, 10, 2018); // Tarih, 29 Ekim 2018

tft.initR(INITR_BLACKTAB); // bir ST7735S yongasını başlat, siyah sekme
// 1.44" TFT kullanıyorsanız bu başlatıcıyı kullanın (açıklama yapmayın)
//tft.initR(INITR_144GREENTAB); // bir ST7735S yongasını başlatıyoruz, KIRMIZI rcB sekmesi
tft.setTextWrap(false); // Metnin sağ kenardan taşmasına izin ver
tft.setRotation(2); // SİYAH PCB ve KIRMIZI tft.setRotation(0) için veya değil.
tft.fillScreen(ST7735_BLACK); // temiz ekran

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // yazılım sıkılaştırma çalışıyor, yüksek seviye -
// kontrol edilen nesneler “çalışmıyor”, 4 kıdemli D portuna da “1” yazılıyor, sayma olmuyor.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + üst karakter ); // kontrol nesnelerinin konum numaralarını gösteriyor
tft.print(rc + 1);
}

tft.setCursor(12, 0); // 3 satırlık metin çıktısı
tft.println("GELİŞTİRİCİLER VE OLUŞTURUCULAR"); // sevdiklerinizi övmek için
tft.setCursor(24, 10); // veya kötü telif hakkı
tft.print("GELİŞTİRİCİ MM");
tft.setCursor(28, 20);
tft.print("OLUŞTURUCU DD");

//veri kurtarma////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Sektörün tüm hücrelerinde yinelenir
//ve her sayaç için 4 bayt olmak üzere 4 pompa değişkeninden oluşan bir diziye yazar, çünkü
// işaretsiz uzun değişken. 4 sayaç vardır, 4'ünün bir kaydı 16 bayt alır.
EEPROM.get(z, pompa[0]); // yani for döngüsü olmadan daha az hacim
EEPROM.get(z+4, pompa[1]);
EEPROM.get(z+8, pompa[2]);
EEPROM.get(z+12, pompa[3]);

// 4 sayacın toplamına yeni bir sonraki değer atanıyor
özet = (pompa [0] + pompa [1] + pompa [2] + pompa [3]);

// sumprim değişkenindeki 4 sayacın toplamının yeni değerini değişkendeki önceki değerle karşılaştırır
// sumsec ve önceki toplam yeni toplamdan küçük veya ona eşitse, yeni büyük veya eşit atanır
// toplamsek değeri.

if (toplamsec <= toplam) {
toplamsek = toplam; //

//ve mevcut değer z, adres değişkenine atanır, z, 16 baytlık 4 değerlik bloğun başlangıcının adresidir
// aynı anda kaydedilen sayaçlar (bir bağlantı noktasını yoklarken 8 bitin tamamı aynı anda yazıldığı için,
// gerekli yüksek 4 bitlik bağlantı noktası D) dahil.
adres = z;
}
}

// 16 kayıtlı sayaç değerinden oluşan 4 baytlık bloğun başlangıcındaki adresteki eeprom belleğine bir kez daha erişiliyor
// sonuncusu, yani. Donma nedeniyle kapanmadan veya yeniden başlatmadan önce değerler. En son kayıt
// sayıcı değerlerini 4 değişkenli bir diziye pompalayın.

EEPROM.get(adres, pompa[0]);
EEPROM.get(adres + 4, pompa[1]);
EEPROM.get(adres + 8, pompa[2]);
EEPROM.get(adres + 12, pompa[3]);

adres += 16; //son kaydın verilerinin üzerine yazmadan sonraki bloğun yazılacağı adresi artırıyoruz

//veri kurtarmanın sonu/////////////////////////////////////////// / ///////////////////

attachInterrupt(0, sayım, YÜKSELEN); // pin D2, kesintileri etkinleştir, her saniye gel
// SQW çıkışından RTC DS3231'den gelen darbeler

wdt_enable(WDTO_8S); // watchdog zamanlayıcısını başlatın, donma durumunda denetleyiciyi yeniden başlatın, zaman,
// bunun için wdt_reset zamanlayıcı sıfırlama komutunu vermeniz ve normal çalışma sırasında yeniden başlatmayı önlemeniz gerekir - 8 saniye.
// testler için değerin 8 saniyenin altına ayarlanması önerilmez.Bu durumda zamanlayıcı tercihen sıfırlanır
// sarsılıyor ve bu her saniye oluyor.

}

geçersiz döngü () {
// boş çevrim, burada elektrik motorunun açık faz çalışması üzerinde kontrol olacak
}

geçersiz sayım() {

tft.setTextColor(ST7735_WHITE); //yazı tipi rengini ayarladık
t = rtc.getTime(); // okuma zamanı
tft.setCursor(5, 120); // imleç konumunu ayarlıyoruz
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // zaman çıkış alanını temizliyoruz
tft.print(rtc.getTimeStr()); // çıkış saati okumaları

wdt_reset(); // watchdog'u her döngüde, yani saniyede sıfırlayın

for (rc = 0; rc < 4; rc ++) // giriş durumunun uygunluğunu kontrol etmek için döngünün başlangıcı
// bağlantı noktası bitlerini bağlantı noktası D bitlerinin önceki okuma durumuna aktarın
{
pinDurumu = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // ve eşleşmiyorsa, o zaman
pumrcounter[rc] = pinDurumu; // port bit durum değişkenine yeni bir değer 1/0 atanıyor
}
// renk kontrol nesnelerinin durumunun belirtilmesi
// MAVİ, mevcut ekranın (veya kitaplığın) küçük bir hatasıdır, RGB ve BGR karışmıştır.
if (pinDurumu == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + kaydırma)), 7, 7, ST7735_BLUE); // düşük seviye sayımı için YEŞİL'i MAVİ'ye değiştirin
} Else {
tft.fillRect(15, ((rc * 10 + kaydırma)), 7, 7, ST7735_GREEN); // düşük seviye sayımı için MAVİ'yi YEŞİL'e değiştirin
pompa [rc] += 1; // çalışma süresi sayacına 1 saniye ekleyin
}
}

k++;
eğer (k == 36) {
k = 0;

tft.fillRect(30, kaydırma, 97, 40, ST7735_BLACK); // çalışma süresi görüntüleme alanının temizlenmesi
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // ve tarihler

tft.setCursor(60, 120); // imleç konumunu ayarlıyoruz
tft.print(rtc.getDateStr()); // LCD ekranda tarihi gösteriyoruz

for (rc = 0; rc < 4; rc ++) //çalışma saatlerinin tamamının, onda birinin ve onda birinin çıktısı
{
tft.setCursor ( 30, rc * 10 +shift ); // ekran 10 piksel aşağı kaydırılarak saatin yüzde biri
tft.println(pompa [rc] / m);
}

// EEPROM'a “ham” çalışma saati değerlerinin (saniye cinsinden) yazılması ///////////////////////////////

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(adres, pompa [rc]);
adres += sizeof(float); // yazma adresi değişkenini arttır
}
}

// kaç byte gönderilmesi gerektiğini belirten verilerden radyo kanalı üzerinden veri gönder.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

imzasız uzun veriler;

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

for (i = 0; i < 4; i++) {
veri = pompa [i ];
radyo.write( &data, sizeof( veri));
}
}
}

Sonunda birkaç not. Sayma, girişlerde düşük mantıksal düzeyde gerçekleşir.

R2-R5 çekme dirençleri, GL36 fotodirençli seçenek için 5516 kOhm'dur. Fototransistör optokuplör ve röle durumunda, 4,7-5,1 kOhm'a ayarlayın. Arduino Nano v3.0 önyükleyicisi, watchdog zamanlayıcısının doğru çalışması için TL866A programlayıcı kullanılarak Arduino Uno ile değiştirildi. Sigortalar 4,3 V'un üzerindeki voltajlarda çalışacak şekilde düzeltilmiştir. Harici sıfırlama devresi R6 C3 kullanılmamıştır. Örnek programda verici frekansı lisanssız aralığa karşılık gelmemektedir; 2,4 MHz aralığı 2400.0-2483.5 MHz frekanslarıyla sınırlıdır.

E01-ML01DP05 vericinin aralığı 2400-2525 MHz'dir. Bir kanalın bant genişliği 1 MHz'dir, hız “RF24_2MBPS” olarak ayarlandığında belirtilen radyo.setChannel(120) kanalı ve bir sonraki kanal meşgul olacaktır, yani. bant 2 MHz olacaktır.

Kaynak: habr.com

Yorum ekle