рд╡рд╛рдпрд░рд▓реЗрд╕ рд╕рдВрдЪрд╛рд░ "рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо"ред рднрд╛рдЧ рджреЛ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ

"рд░реЗрдбрд┐рдпреЛ-рдирд┐рдпрдВрддреНрд░рд┐рдд" рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрдбрд╝реЗ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдРрд╕реЗ рдереЗ рдЬреЛ рдПрдХ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдЬреЛ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдХреЛрдб рдХреЗ рдЕрдкрдиреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ - рдореИрдВрдиреЗ рдПрдХ "рд▓рд╛рдЗрдЯ" рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬреЛ рдЖрдкрдХреЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдЧрд╛ред

рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдмрд╕реЗ рд╢рд╛рдирджрд╛рд░ рдФрд░ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЬ рд╣рдо рдПрдХ рд╣реЛрдо рдорд┐рдиреА-рд╕рд┐рд╕реНрдЯрдо (рдШрдбрд╝реА, рдХреИрд▓реЗрдВрдбрд░, рдореМрд╕рдо, рд╕реЗрдВрд╕рд░ рдореЗрдВ рдмреИрдЯрд░реА рд╕реНрддрд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрдЖрджрд┐) рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ "рдореБрдЦреНрдп" рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдПрдХ рдмрдбрд╝реЗ рдПрд▓рдИрдбреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде) рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ), рджреЛ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рд╕реЗрдВрд╕рд░ (рддрд╛рдкрдорд╛рди рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ) рдФрд░ NTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рдордп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдореЙрдбреНрдпреВрд▓ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛:

рдврд╛рд▓ MaTrix

рдЕрд░реБрдбрд┐рдиреЛ рдореЗрдЧрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдмреЛрд░реНрдб (рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рд╣реЛрдЧрд╛ , рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж)ред рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдкрдХреЛ рд╕реВрдЪрдирд╛ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЪрд╛рд░ 8x8 рдмрд╛рдЗрдХрд▓рд░ рдПрд▓рдИрдбреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдПрдХ рдПрдХрд▓ 32x8 рдлрд╝реАрд▓реНрдб рдмрдирд╛рддрд╛ рд╣реИ (рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдХрд╛рдлреА рдмрдбрд╝реЗ рд╣реИрдВ)ред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдмреЛрд░реНрдб рдореЗрдВ рд╣реИ:


рдореЙрдбреНрдпреВрд▓ "рдХреНрдпрд╛ рдерд╛" рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкреНрд░рджрд░реНрд╢рди рдЗрдХрд╛рдИ рдкреНрд░рд╕рд┐рджреНрдз рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ (74HD595D - рдирд┐рдпрдВрддреНрд░рдг рдПрд▓ рдИ рдбреА "рдХреЙрд▓рдо рдореЗрдВ") рдФрд░ рдбреАрдореБрд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд░ (74HD138D - рдирд┐рдпрдВрддреНрд░рдг "рдкрдВрдХреНрддрд┐рдпреЛрдВ") рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдХреЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдореВрд▓ рдЖрджрд┐рдо ("рдкреНрд░рд┐рдВрдЯ рдП рд▓рд╛рдЗрди", "рдХреНрд░реАрдкрд┐рдВрдЧ рд▓рд╛рдЗрди", рдмреНрд░рд╛рдЗрдЯрдиреЗрд╕ рдХрдВрдЯреНрд░реЛрд▓, рдХрдИ рдкреНрд░рднрд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред

рд╢реАрд▓реНрдб рдореЗрдВ рд╕реНрд╡рдпрдВ рдПрдордХреЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ "рдЕрд░реБрдбрд┐рдиреЛ рдореЗрдЧрд╛" рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдХреНрд▓реЛрди (рдореБрдЭреЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ ) рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╢реАрд▓реНрдб Marix рдореИрдЯреНрд░рд┐рдХреНрд╕ рдпреЛрдЬрдирд╛рдмрджреНрдз рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рд╕реЗрдВрд╕рд░ рдиреЛрдб

рдпрд╣ Atmega328 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ Arduino- рд╕рдВрдЧрдд рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬреЛ рдПрдХ рдПрдХрд▓ CR2032 рд▓рд┐рдерд┐рдпрдо рдмреИрдЯрд░реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рддрд╛рдкрдорд╛рди рд╕реЗрдВрд╕рд░ "рдСрди рдмреЛрд░реНрдб" (MCP9700), рдПрдХ рдмрдЯрди, рдПрдХ рдПрд▓рдИрдбреА рдФрд░ рддреАрди рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдЬреЛ рд╕рдВрднрд╡ "рдПрдХреНрд╕рдЯреЗрдВрд╢рди" (рд╕реЗрдВрд╕рд░, рдЖрджрд┐) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред

рд╕реЗрдВрд╕рд░ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ:


рдкрд╛рдардХреЛрдВ рдХреЗ рдмреАрдЪ рд░реБрдЪрд┐ рд╣реЛрдиреЗ рдкрд░, рдореИрдВ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦреВрдВрдЧрд╛ред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмреИрдЯрд░реА рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо 8 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдЖрдВрддрд░рд┐рдХ рдерд░рдерд░рд╛рдирд╡рд╛рд▓рд╛ рд╕реЗ рдПрдордХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдордХреЗ рдХреЛ рдХрдо рд╡реЛрд▓реНрдЯреЗрдЬ (1.8 рд╡реА рд╕реЗ) рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреЛрд░реНрдбреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВред Txt рдлрд╝рд╛рдЗрд▓:
s328o8.name=Sensor328 (int8MHz, 1.8V)

s328o8.upload.protocol=arduino
s328o8.upload.maximum_size=30720
s328o8.upload.speed=19200

s328o8.bootloader.low_fuses=0xe2
s328o8.bootloader.high_fuses=0xda
s328o8.bootloader.extended_fuses=0x06
s328o8.bootloader.path=atmega

s328o8.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex

s328o8.bootloader.unlock_bits=0x3F
s328o8.bootloader.lock_bits=0x0F

s328o8.build.mcu=atmega328p
s328o8.build.f_cpu=8000000L
s328o8.build.core=arduino
s328o8.build.variant=standard


UPD: 2.4. 1.8 1. :

s328o1.name=Sensor328p (int1MHz, 1.8V)

s328o1.upload.protocol=arduino
s328o1.upload.maximum_size=30720
s328o1.upload.speed=19200

s328o1.bootloader.low_fuses=0x62
s328o1.bootloader.high_fuses=0xda
s328o1.bootloader.extended_fuses=0x06
s328o1.bootloader.path=atmega

s328o1.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex

s328o1.bootloader.unlock_bits=0x3F
s328o1.bootloader.lock_bits=0x0F

s328o1.build.mcu=atmega328p
s328o1.build.f_cpu=1000000L
s328o1.build.core=arduino
s328o1.build.variant=standard


тАФ , . , Arduino . avrdude ( avrdude GUI тАФ ).

, ┬л Sensor Node (SN) ┬╗ тАФ .
:
  • ┬л┬╗ ,
  • 8
  • SN ┬л┬╗ 1 8 , , ( тАФ , ┬л┬╗)

( 20 ) 2.83.

, , , , 4 , , , , .

.

iBoard

. : 328, LAN Wiznet W5100, nrf24l01+, SD, .
( ) тАФ .

nRF24l01+

RF-, 2.4. .
RF24 ( iBoardRF24).


, :

( ), - , , .

:
  1. Shield MaTrix: (iBoard тАФ ┬л /┬╗), , , ( ), ┬л┬╗ .
  2. Sensor Node: , . , ( ┬л┬╗ ).
  3. iBoard: DHCP, NTP-, , / .


, , .
.



nRF24l01+ тАФ , ( ) .

, ┬л ┬╗ 32 .
тАФ , ┬л┬╗ .
:
//     
typedef struct{         
  int SensorID;        //  
  int ParamID;         //   
  float ParamValue;    //  
  char Comment[16];    // 
}
Message;


, 32 .

(SensorID): Shield MaTrix тАФ 100, Sensor Node 1 (SN1 тАФ ┬л┬╗) тАФ 200, SN2 (┬л┬╗) тАФ 300, iBoard тАФ 900.

, тАФ , .

, ┬л┬╗ , ( , ┬л┬╗ 2 тАФ ( тАФ )).

, ┬л┬╗ :
///     
typedef struct{
  float Value;         //  
  char Note[16];       // 
} 
Parameter;


(Value) float ( , ( , ) тАФ ).
Note ┬л ┬╗ ( ┬лTempIN, C┬╗ тАФ ).

, (Parameter) ┬л┬╗ (Message).

.

SN1 SN2. :
  1. setup() тАФ
  2. loop():
    • , ┬л┬╗
    • тАФ
    • RF-

( 8 ), ( ) 8 тАФ , , 8- . 4 , , , 30 , .
тАФ RF- ( powerDown() ).

, тАж

, ┬л┬╗ :

Parameter MySensors[NumSensors+1] = {    //   (  )
  NumSensors, "SN1 (in)",            //   ""        
  0, "TempIN, C",                        //    
  0, "VCC, V",                           //   (   )
  0, "BATT"                              //  ,     (0 -  "", 1 - "")
};

Message sensor; 


┬л┬╗:

Parameter MySensors[NumSensors+1] = {    //   (  )
  NumSensors, "SN1 (in&out)",        //   ""        
  0, "TempIN, C",                        //    
  0, "VCC, V",                           //   (   )
  0, "BATT",                             //  ,     (0 -  "", 1 - "")
  0, "TempOUT, C"                        //    
};

Message sensor;


┬л┬╗ (TempIN), (TempOUT), .

┬л┬╗ ┬л┬╗ . ┬л┬╗ () MCP9700 ( ┬л ┬╗ тАФ , .

тАФ , MCP9700 . ( тАФ , , ). . ( ) ┬лAnalog┬╗).

.

, MCP9700 , , .

, ( SN , 328).
( , , ).
:
long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  

  delay(75); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}


.

, SN1 тАФ 200:
//     
void calculateValue(){
  //    
  //  
  MySensors[2].Value = ((float) readVcc())/1000.0;
  
  //    (  3)
  MySensors[1].Value = (((float)analogRead(A3) * MySensors[2].Value / 1024.0) - 0.5)/0.01;
  
  //    2.4 -  "" (1)
  //   - " " (0)
  MySensors[3].Value = (MySensors[2].Value > 2.4) ? 1 : 0; 
  
  return;
}


SN2 (┬л┬╗ тАФ 300):
//     
void calculateValue(){
  //    
  //  
  MySensors[2].Value = ((float) readVcc())/1000.0;
  
  //    (  3)
  MySensors[1].Value = (((float)analogRead(A3) * MySensors[2].Value / 1024.0) - 0.5)/0.01;
  
  //    2.4 -  "" (1)
  //   - " " (0)
  MySensors[3].Value = (MySensors[2].Value > 2.4) ? 1 : 0; 
  
  //    (  1   "Analog")
  MySensors[4].Value = (((float)analogRead(A1) * MySensors[2].Value / 1024.0) - 0.5)/0.01;
  
  return;
}


, , ┬л┬╗ .

- , ( 4 ) тАФ ┬л┬╗ (mode = 1) ┬л┬╗ (mode = 2).
┬л┬╗ , 8 .
┬л┬╗ , 4 ( ).
┬л┬╗ 10 (.. 10 ┬л┬╗ тАФ ). , , .

, ┬л┬╗ .

- ┬л /┬╗ ( iBoard).
/ тАФ .

, .
┬л┬╗ - / float.

: ┬лyymm.dd┬╗, тАФ ┬лhhmm.ss┬╗. float.

, , ┬л /┬╗:
Parameter MySensors[NumSensors+1] = {    //   (  )
  NumSensors, "iBoard NTP",              //   ""        
  0, "Date (yymm.dd)",                   // 
  0, "Time (hhmm.ss)"                    // 
};

Message sensor; 


/ , (, , , тАФ , 10 , ( )).

тАФ , ( ):
#define TimeOffset 4  //   - GMT +4 ()


, iBoard SN, тАФ RF24 (iBoard ┬л┬╗ ).

, , тАФ (┬л тАФ тАФ тАФ ┬╗), ┬л┬╗ тАФ Shield MaTrix тАФ , .

┬л┬╗: , ┬л┬╗ ( ┬л┬╗ ), , , Shield MaTrix.

: , , тАФ ┬л┬╗. [0,┬л┬╗] тАФ map(...), ┬л┬╗ ( 20 255, ).

┬л┬╗ :
  1. ( digit6x8future, )
  2. ( font6x8, )
  3. ( font6x8, (+)
  4. ( , ). .
  5. ( , ).

- , ┬л ┬╗ ( ) тАФ тАФ ( , ), : ┬л (CR2032) !┬╗ , .


, :


?


  1. ┬л┬╗ ( , MaTrix ┬л ┬╗).
  2. SN (, ..).
  3. SN ( ┬л┬╗ ).
  4. ┬л┬╗ ┬л┬╗ , ┬л ┬╗ .
  5. ( , iBoard: , ┬л┬╗ SD- (, iBoard microSD) - , " " - , ).
  6. (, MaTrix (300 -> 100) - - ).

, .



:


P.S. , , ( тАФ ).

Source: https://habr.com/ru/post/In202898/


All Articles