Arduino schéma - arduino.sk

ArSer

Vaše nápady a pomoc s Vašimi projektami
Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

ArSer

Poslaťod xeram » Pia 01. Mar 2013 18:14:41

ArSer Arduino Server je projekt ktorému sa venujem asi 1,5 - 2 roky a stále nevidím svetlo na konci tunela. Vlastne ešte som nevidel ani tunel.
Prílohy
zostava.jpg
zostava.jpg (66.38 KiB) Zobrazené 2696 krát

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Pia 01. Mar 2013 18:21:21

1 - Arser
2 - Asus RT-N16 server, voľakedy router dnes okrem iného aj router
3 - HDD WD 500MB

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Pia 01. Mar 2013 18:33:20

Železo Arser "inside":
1 - Arduino Duemilanove
2 - ethernet shield (Wiznet)
Arduino+ethershield: zber dát od slaves, prenos dát k slaves-om (synchr. času, riadenie výstupov...)
3 - transceiver 868MHz RFM12b komunikuje so slaves zatiaľ 2ks.
4 - receiver 434MHz aurel AC-RX + PIC12F629 príjem signálov z PIR.
5 - bzučiak + menič PWM/-2,1V krepý display potrebuje záporné predpätie na riadenie kontrastu!
6 - anténa 868MHz.
7 - anténa 434MHz.
Prílohy
zelezo.JPG
zelezo.JPG (86.97 KiB) Zobrazené 2694 krát

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Pia 01. Mar 2013 18:39:12

železo do PIR: vysielač Aurel TX4MSIL 434MHz + PIC12F629, napájané 220V sieťové, "kondenzátorový" zdroj.
Prílohy
pirka.JPG
pirka.JPG (61.78 KiB) Zobrazené 2689 krát

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Pia 01. Mar 2013 18:40:45

Na dnes všetko. Je toho dosť, pomaly sám strácam prehľad :mrgreen:

Príspevky: 38
Registrovaný: Pon 28. Jan 2013 16:40:32

Re: ArSer

Poslaťod 007ToMMaS » Ned 03. Mar 2013 20:56:08

Pekný projekt. Ale zaujímalo by ma čo vlastne ten server je lebo som akosi nepostrehol načo ;) Možno by to blo fajn v popise ;)

Obrázok užívateľa
Príspevky: 165
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: ArSer

Poslaťod tomXX » Ned 03. Mar 2013 22:57:30

Ja som kúpil dve sady 433 MHz RX/TX - http://www.ebay.com/itm/261041100836 , cena úplne bezkonkurenčná :)

Len som do pätice zasunul ATtiny85 naopak, tak sa odporúčal. Ale chcel by som skôr ATTINY45V-10SU, len tie u nás zrovna nedržia a z farnellu sa mi to len kvôli tomu nechce objednávať :(

PS: tiež neviem čo ten Tvoj ArSer robí :) Nejaký alarm/protipožiarny systém?
magic smoke - A substance trapped inside integrated circuit packages that enables them to function. Its existence is demonstrated by what happens when a chip burns up - the magic smoke gets let out, so it doesn't work any more.

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Pon 04. Mar 2013 18:13:05

Veru, tuším som zabudol to najpodstatnejšie! Čiže:
ArSer (master) zbiera data od slave-ov, alebo im posiela data, nastavuje čas, cez ethernet shield komunikuje so serverom a data ukladá, resp. bude ukladať do db.
Signály od PIR zobrazuje na display, prípadne vydáva výstražné pípane, podľa toho ktorý PIR zapol. Každý PIR má svoje ID, ktoré aj vysiela čiže je možné analyzovať smer pohybu prípadného votrelca. Posledná úloha: v spolupráci s nástennou jednotkou bude riadiť klímu, pretože tá sa ovláda iba cez IR a ArSer ako jediný "vidí" priamo na klímu - ešte budem musieť "hacknúť" IR ovládanie.
Slaves sú zatiaľ dvaja: nástenná jednotka (familiárne Nastenka ;) ) niečo ako izbový termostat vyššieho levelu bude merať teploty, vypočítavať tzv. pohodovú teplotu a podľa toho riadiť kúrenie a klímu (možno solárko), nastavovať režimy denný/nočný...
Slave č.2 skoro ako meteostanica - meranie teplôt, atm. tlaku (Bosch BMP085), vlhkosť... Ak zostane nejaký ten pin voľný tak aj závlahy.
Ciele sú veliké, odhodlanie a elán zatiaľ tiež :P

Obrázok užívateľa
Príspevky: 165
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: ArSer

Poslaťod tomXX » Uto 05. Mar 2013 8:51:51

Ak chceš riešiť IR, pozri na túto libku, nemusíš potom "vymýšľať koleso" - https://github.com/shirriff/Arduino-IRremote Vie to aj posielať IR kódy.
magic smoke - A substance trapped inside integrated circuit packages that enables them to function. Its existence is demonstrated by what happens when a chip burns up - the magic smoke gets let out, so it doesn't work any more.

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Ned 17. Mar 2013 12:21:09

Ďalší článok reťaze: Nástenná jednotka (nastenka). Zatiaľ je na stole, čiže by malo byť "nastolka". V základnom režime zobrazuje čas, vnútornú a vonkajšiu teplotu - stránky sa dokola "preklápajú". Aby bolo jasné o akú teplotu ide vnútorná sa zobrazuje ako XY.Z°C, vonkajšia XZ.Z°. Stlačením tlačidla "+", alebo "-" sa dostávame do prezeracieho menu - zatiaľ sú to 3 stránky. Listuje sa opäť tlačidlami "+" a "-". Súčasným stlačením "+-" sa zobrazí "setovacie" menu kde je možné nastavovať čas a rôzne "setpointy". Lepšie by bolo video, ale nie som moc dobrý kameraman.
Prílohy
zostava.JPG

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Ned 17. Mar 2013 12:22:44

zobrazenie vnútornej teploty
Prílohy
teplota1.JPG

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Ned 17. Mar 2013 12:25:44

"setovacie" menu. šipka ukazuje ktorú hodnotu ideme zmeniť. Nastavuje sa súčasným stlačením ENTER (prostredná klávesa) a "+" alebo "-".
Prílohy
set_menu.JPG

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Ned 17. Mar 2013 12:41:38

Zaujímavá stránka "systémové info". Zobrazuje časy trvania vybraných taskov.
tsk0 - prečítanie údajov z 18B20 a spustenie prevodu
tsk1 - určenie stránky pre display - nemerateľné
tsk2 - čas "vykreslenia" veľkých hodín
tsk3 - čas "vykreslenia" vnútornej teploty
tsk4 - čas zpracovania prezeracej stránky
tsk5 - čas zpracovania set. menu
tsk6, tsk7 nevyužité
Časy sú v ms. Je vidieť, že Arduino Pro mini @8Mhz (3.3V) sa pomerne nudí, aspoň zatiaľ!
Prílohy
tasky.JPG

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: ArSer

Poslaťod xeram » Ned 17. Mar 2013 12:44:54

Kto by mal záujem zverejňujem aj kód.
Kód: Vybrať všetko
#include <OneWire.h>
#include <OneWireTempSensor.h>
#include <LiquidCrystal.h>
#include "Timer.h"
Timer t;

#define plus 4      //pin pre klávesu pridaj
#define enter 5     //pin pre klávesu enter
#define minus 6     //pin pre klávesu uber
#define cnt1_c 5    //perióda prepínania veľkých displejov v sek.
#define cnt2_c 20   //max. čas nečinnosti kláves
LiquidCrystal lcd(2,3,4,5,6,7);
OneWireTempSensor sensor(A3);
const byte lines[][14]={
//  0    1    2    3    4    5    6    7    8    9   SPC   -    C    °
  {0x98,0x20,0x58,0x58,0x8C,0x94,0x94,0x58,0x98,0x98,0x00,0x00,0x98,0x98},
  {0x88,0x60,0xF8,0x38,0xB8,0xBC,0xBC,0x34,0xB8,0xB8,0x00,0x3C,0x80,0x54},
  {0x88,0x20,0x80,0x08,0x08,0x08,0x88,0x20,0x88,0x08,0x00,0x00,0x80,0x00},
  {0xB8,0xEC,0xBC,0xF8,0x08,0xF8,0xB8,0x20,0xB8,0xF4,0x00,0x00,0xB8,0x00}};
byte c1[8]={0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
byte c2[8]={0b11111,0b11111,0b11111,0b11111,0b00000,0b00000,0b00000,0b00000};
byte c3[8]={0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};
byte c4[8]={0b00000,0b00000,0b00000,0b00000,0b11111,0b11111,0b11111,0b11111};
byte c5[8]={0x00,0x00,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E};
boolean dp_blink = 0;
byte bfr[]={0,0,0,0,0};
byte secs = 0;
byte last_key = 0;
byte cnt1 = 0;
byte cnt2 = 0;
byte lcd_page = 0;
byte kbd_fast = 0;
byte t_var = 0;
byte cur_pos = 0;
byte index_var = 0;
//                      0      1     2      3       4    5    6     7      8
const char* name[] = {"hod","min","rezim","t_ini","alm","v1","v2","alm2","alm3"};
boolean flo_int[] = {0,0,0,1,1,1,1,1,1};
//              0  1  2  3   4   5   6   7   8
int var_val[]= {1, 0, 0,220,240,250,140,190,550};
int lim_up[] = {23,59,6,330,330,330,150,220,600};
int lim_do[] = {0, 0, 1,150,190,200,100,150,500};
int num_sensors;  //počet snímačov teploty
int task_t[]={0,0,0,0,0,0,0,0};//meranie času jednotlivých taskov
unsigned long tmp_mil;
float temp[]={99.99,99.9,99.9};

void setup(void){
  lcd.begin(20,4);
  lcd.createChar(0,c1);  //vytvorenie segmentov pre veľký LCD
  lcd.createChar(1,c2);
  lcd.createChar(2,c3);
  lcd.createChar(3,c4);
  lcd.createChar(4,c5);  //veľká des. bodka
  pinMode(A2,OUTPUT);
  digitalWrite(A2,LOW);// !!!docasne - zem pre 18B20
  num_sensors = sensor.getDevices();
  sensor.getConv();  // spusti meranie teploty pre všetky snímače
  t.every(200, tmr02);
  t.every(500, tmr05);
  t.every(1000, tmr1);
  t.every(2000, tmr2);
}

void loop(void){
  t.update();
}

void tmr02(){  //200ms tasky
  if(kbd_fast == 5){
    klavesy();
    zobraz();
  }
}

void tmr05(){  //500ms tasky
  if(kbd_fast < 5){
    klavesy();
    zobraz();
  }
}

void tmr1(){  //sekundové tasky
  hodiny();
  sec_cnt();
}

void tmr2(){  //2sek. tasky
  teploty();
}

void hodiny(){
  dp_blink ^= 1;
  secs++;
  if(secs == 60){
    secs = 0;
    var_val[1]++;
    if(var_val[1] == 60){
      var_val[1] = 0;
      var_val[0]++;
      if(var_val[0] == 24)var_val[0] = 1;
    }
  }
}

void sec_cnt(){  //časovače pre LCD
  if(cnt1 !=0 && cnt2 ==0) cnt1--;
  if(cnt2 !=0) cnt2--;
}


//_____meranie teplôt_____
void teploty(){
  tmp_mil = millis();
  for(int i=0; i<num_sensors; i++){
    temp[i] = sensor.getTempC(i);
  }
  sensor.getConv();
  task_t[0] = (int)millis() - tmp_mil;
}

//_____načítanie kláves_____
void klavesy(){
/* klávesy zdieľajú spol. piny s LCD D4,D5,D6
po ukončení rutiny ich o5 treba nastavť ako výstupné!!! */
  last_key = 0;
  pinMode(plus,INPUT_PULLUP);
  pinMode(enter,INPUT_PULLUP);
  pinMode(minus,INPUT_PULLUP);
  if(!digitalRead(plus))bitSet(last_key,2);
  if(!digitalRead(enter))bitSet(last_key,1);
  if(!digitalRead(minus))bitSet(last_key,0);
  pinMode(plus,OUTPUT);
  pinMode(enter,OUTPUT);
  pinMode(minus,OUTPUT);
}

void zobraz(){
  tmp_mil = millis();
//  ****** urči a zobraz stranu na LCD ******
/*
strany 1,2,3 - automat. prepínanie veľkých displejov
strany 4...9 - rezerva
strany 10...10+view_ps - ručné prepínanie "prezeracích" stran
strany 100...100+set_ps - setovacie menu */
  byte view_ps = 3;  // pocet prezer. stran
  byte set_ps = 2;   // pocet set. stran
  byte old_page = lcd_page;
 
//  ****** súč. stlač. "+" & "-" vstup/výstup do/zo set. menu******
  if(last_key == 5){
    last_key = 0;
      if(lcd_page < 100){
      lcd_page = 100;
      cnt2 = cnt2_c;
      cur_pos = 1;
      index_var = 0;
    } else {
      cnt2 = 0;
    }
  }
// ****** aktivacia "autorepeat" pri setovani up/down ******
  if(last_key == 3 || last_key == 6){
    kbd_fast++;
    cnt2 = cnt2_c;
    if(kbd_fast > 5)kbd_fast = 5;
  }else{
    kbd_fast = 0;
  }
 
//  ****** klavesa "-" ******
  if(last_key == 1){
    cnt2 = cnt2_c;
    if(lcd_page >= 100){// set. menu
      index_var--;
      cur_pos--;
      if(cur_pos == 0){
        cur_pos = 4;
        lcd_page--;
        if(lcd_page < 100){
          lcd_page = 99 + set_ps;
          index_var = set_ps * 4 -1;
        }
      }
    }
    if(lcd_page > 9 && lcd_page < 100){// prezeracie menu
      lcd_page--;
      if(lcd_page < 10)lcd_page = 9 + view_ps;
    }
    if(lcd_page < 10)lcd_page = 9 + view_ps;//prechod na prez. menu
  }
 
  //****** len klaves ENTER ******
  if(last_key == 2 && lcd_page > 9)cnt2 = cnt2_c;
 
  //****** kl. "-" & ENTER ******
  if(last_key == 3 && lcd_page >= 100){
    var_val[index_var]--;
    if(var_val[index_var] < lim_do[index_var])var_val[index_var] = lim_up[index_var];
  }
 
//  ****** klavesa "+" ******
  if(last_key == 4){
    cnt2 = cnt2_c;
    if(lcd_page >= 100){// set.menu
      index_var++;
      cur_pos++;
      if(cur_pos == 5){
        cur_pos = 1;
        lcd_page++;
        if(lcd_page > 99 + set_ps){
          lcd_page = 100;
          index_var = 0;
        }
      }
    }
    if(lcd_page > 9 && lcd_page < 100){// prezer. menu
      lcd_page++;
      if(lcd_page > 9 + view_ps)lcd_page = 10;
    }
    if(lcd_page < 9)lcd_page = 10;//  prechod na prez. menu
  }
 
//  ****** klav. "+" & ENTER ******
  if(last_key == 6 && lcd_page >= 100){
    var_val[index_var]++;
    if(var_val[index_var] > lim_up[index_var])var_val[index_var] = lim_do[index_var];
  }

/*  nebol stlačený kláves a uplynul čas zobrazenia prezeracieho/set. disp.
rotuj stránky 1,2,3-veľký display,  */
  if(last_key == 0 && cnt2 == 0){
     if(cnt1 == 0){  //"preklopenie" stránky po cnt1_c sekundách
       cnt1 = cnt1_c;
       lcd_page++;
       if(lcd_page > 3)lcd_page = 1;
     }
  }
  if(lcd_page != old_page)lcd.clear();
  task_t[1] = (int)millis() - tmp_mil;
// "vykreslenie" jednotlivých strán
  tmp_mil = millis();
  if(lcd_page == 1){
    byte hods = (byte)var_val[0];
    byte minut = (byte)var_val[1];
    LCD_time(hods, minut);
    task_t[2] = (int)millis() - tmp_mil;
  }
  if(lcd_page == 2){
    LCD_print(temp[1],1,1);  // vnút. tepl. zobraz xy.z°C
    task_t[3] = (int)millis() - tmp_mil;
  }
  if(lcd_page == 3)LCD_print(temp[0],1,0);  // vonk. tepl. zobraz xy.z°
 
  // ****** prezeracie strany ******
  if(lcd_page == 10){
    tmp_mil = millis();
    lcd.setCursor(0,0);
    lcd.print("cas: ");
    lcd.print(var_val[0]);lcd.print(":");
    if(var_val[1] < 10)lcd.print("0");
    lcd.print(var_val[1]);lcd.print(":");
    if(secs < 10)lcd.print("0");
    lcd.print(secs,DEC);
    lcd.setCursor(0,1);
    lcd.print("t_int ");lcd.print(temp[0]);
    lcd.write(0xDF);lcd.print("C ");
    lcd.setCursor(0,2);
    lcd.print("t_ext ");lcd.print(temp[1]);
    lcd.write(0xDF);lcd.print("C ");
    lcd.setCursor(0,3);
    lcd.print("temp3 ");lcd.print(temp[2]);
    lcd.write(0xDF);lcd.print("C ");
    task_t[4] = (int)millis() - tmp_mil;
  }
  if(lcd_page == 11){// syst. info - zobraz čas trvania taskov
    for(int i=0; i<4; i++){
      lcd.setCursor(0,i);
      lcd.print("tsk");lcd.print(i);
      lcd.print(" ");lcd.print(task_t[i]);
    }
    for(int i=0; i<4; i++){
      lcd.setCursor(9,i);
      lcd.print("tsk");lcd.print(i+4);
      lcd.print(" ");lcd.print(task_t[i+4]);
    }
  }
  if(lcd_page == 12){
    lcd.setCursor(0,0);
    lcd.print("pocet 18B20: ");
    lcd.print(num_sensors);
  }
 
  //****** setovacie menu ******
  if(lcd_page >= 100){
    tmp_mil = millis();
    int offs;
    for(int i=0; i<4; i++){
      offs = (int)((lcd_page - 100)*4)+i;
      lcd.setCursor(0,i);
      lcd.print(name[offs]);
      lcd.setCursor(7,i);
      lcd.print(" ");
      if(flo_int[offs]){
        float t_var = (float)var_val[offs]/10.0;
        lcd.print(t_var,1);
      } else {
        lcd.print(var_val[offs]);
      }
      lcd.print(" ");
    }
   lcd.setCursor(7,cur_pos-1);
   lcd.write(0x7E);//"0x3E >" "0x7E ->"
   task_t[5] = (int)millis() - tmp_mil;
  }
}

/*______VEĽKÝ DISPLAY______
_____________________________
zobraz hours:minuts, alebo skóre domáci:hostia */
void LCD_time(byte hrs, byte mns){
  bfr[1] = hrs;
  bfr[4] = mns;
  bfr[2] = 10;
  bfr[0] = bfr[3] = 0;
  if(bfr[1] > 99){   //ak hours>99 zobraz "--"
    bfr[0] = 11;
    bfr[1] = 11;
  } else {
    while(bfr[1] > 9){
      bfr[1] -= 10;
      bfr[0]++;
    }
    if(bfr[0] == 0) bfr[0] = 10; //potlačenie nuly v hod.
  }
  if(bfr[4] > 99){   //ak minuts>99 zobraz "--"
    bfr[3] = 11;
    bfr[4] = 11;
  } else {
    while(bfr[4] > 9){
      bfr[4] -= 10;
      bfr[3]++;
    }
  }
  LCD_draw();
  if(dp_blink){   //zobraz ":"
    lcd.setCursor(9,1);
    lcd.write(1);
    lcd.setCursor(9,2);
    lcd.write(3);
  }
}

//zobraz čísla od -99,9 do 99,9 príp. znaky "°" "C"
void LCD_print(float f_number, boolean zn1, boolean zn2){
  bfr[0]=bfr[1]=bfr[2]=bfr[3]=bfr[4]=0;
  int t_intg = (int)(f_number * 10.0);
  byte i=0;
  if(t_intg <0){
    t_intg *= -1;
    bfr[i]=11;   //zápor. teplota "-"
    i++;
  }
  while(t_intg >= 100){   //100-ky
    t_intg -= 100;
    bfr[i]++;
  }
  if(bfr[i] != 0)i++;
  while(t_intg >= 10){   //10-ky
    t_intg -= 10;
    bfr[i]++;
  }
  i++;
  bfr[i] = t_intg;   // 1-ky
  i++;
  if(zn1){
    bfr[i]=13;   //znak "°"
    i++;
  }
  if(zn2){      //znak "C"
    bfr[i]=12;
    i++;
  }
  while(i<5){
    bfr[i]=10;   //nevyužité buffery vyfuguj!
    i++;
  }
  LCD_draw();
  //des. bodka
  byte col=7;
  if(f_number < 0)col += 4;
  if(f_number < 10)col -= 4;
  lcd.setCursor(col,3);
  lcd.write(4);
}

// "vykreslenie" veľkého displeja
void LCD_draw(){
  byte t_char1;
  byte t_char2;
  for(int r=0; r<4; r++){      //RIADOK
    lcd.setCursor(0,r);
    for(int z=0; z<5; z++){    //ZNAK
      t_char1=lines[r][bfr[z]];
      for(int s=0; s<4; s++){  //SEGMENT
        t_char2 = t_char1 >>6;
        t_char1 <<= 2;
        lcd.write(t_char2);
      }
    }
  }
}

Príspevky: 38
Registrovaný: Pon 28. Jan 2013 16:40:32

Re: ArSer

Poslaťod 007ToMMaS » Uto 09. Júl 2013 21:47:46

AHoj, chcel by som sa s ťa spýtať. Odosielaš cez 433mhz aj viac hodnôt ako jednu? Ak viac ako ich odosielaš? lebo ten problém riešim asi mesiac a bez úspechu. Stále mi ide odoslať iba jednu a priradiť si ju k danej veličine ale viac sa mi ich nepodarilo.

Ďalší

Späť na Projekty vo fáze vývoja