Hello.
I wrote the code here, it generally works, but sometimes it hangs for some reason.
Here is the code itself:

#include <EEPROMex.h> //Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π°Ρ€Π΄ΡƒΠΈΠ½ΠΎ #include <avr/sleep.h> //Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² сна #define mosfet_pin 2 //Ρ€Π΅Π»Π΅ ΠΈΠ»ΠΈ мосфСт Π½Π° D2 #define trigger_pin 3 //спусковая ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π° D3 #define out_pin 4 //5v D4 #define out_pin2 5 //5v D5 #define fireled 6 //ΠΏΠΈΠ½ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ volatile unsigned long lastshot; //врСмя послСднСго наТатия для Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° сна boolean trig_state; //пСрСмСнная для хранСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояняи ΠΊΠ½ΠΎΠΏΠΊΠΈ boolean flag; //Ρ„Π»Π°ΠΆΠΎΠΊ для запоминания полоТСния ΠΊΠ½ΠΎΠΏΠΊΠΈ boolean block; //Ρ„Π»Π°ΠΆΠΎΠΊ для запоминания Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ boolean waitblink; //Ρ„Π»Π°ΠΆΠΎΠΊ для оТидания 5 ΠΌΠΈΠ³Π°Π½ΠΈΠΉ int presscount; //считаСм ΠΊΠΎΠ»-Π²ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ byte trigger; //ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ спусковой ΠΊΠ½ΠΎΠΏΠΊΠΈ float my_vcc_const; // константа Π²ΠΎΠ»ΡŒΡ‚ΠΌΠ΅Ρ‚Ρ€Π° int voltage; void setup() { Serial.begin(9600); my_vcc_const = EEPROM.readFloat(8); block = 0; pinMode(mosfet_pin, OUTPUT); //ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΈΠ½ Ρ€Π΅Π»Π΅ ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄ pinMode(trigger_pin, INPUT_PULLUP); //ΠΏΠΈΠ½ ΠΊΠ½ΠΎΠΏΠΊΠΈ подтянут Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ рСзистором, рСзистор Π½Π° 10 кОм НЕ НУЖЕН pinMode(out_pin, OUTPUT); //5v pinMode(out_pin2, OUTPUT); //5v attachInterrupt(1, trigger_press, FALLING); //Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ (ΠΏΡ€ΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ) } void trigger_press() { //ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания //просыпаСмся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ! } void loop() { voltage = readVcc(); //Serial.println(voltage); trig_state = digitalRead(trigger_pin); //ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ fire if(trig_state == 1 && flag == 1) //Ссли ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΡ‚ΠΆΠ°Ρ‚Π° ΠΈ Ρ„Π»Π°Π³=1 { digitalWrite(LED_BUILTIN, LOW); digitalWrite(mosfet_pin, LOW); //Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ мосфСт flag=0; //ставим Ρ„Π»Π°ΠΆΠΎΠΊ, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° большС Π½Π΅ Π½Π°ΠΆΠ°Ρ‚Π° Serial.print("STOP FIRE!!!"); } if(trig_state == 0 && flag == 0 && waitblink == 0) //Ссли ΠΊΠ½ΠΎΠΏΠΊΠ° fire Π½Π°ΠΆΠ°Ρ‚Π° Ρ„Π»Π°Π³=0 ΠΈ ΠΌΠΎΠ΄ Π½Π΅ ΠΌΠΈΠ³Π°Π΅Ρ‚ { if(presscount > 3) { if(block == 0) { waitblink = 1; for(int i=0; i<5; i++) { digitalWrite(LED_BUILTIN, HIGH); delay(200); digitalWrite(LED_BUILTIN, LOW); delay(200); } waitblink = 0; block = 1; Serial.print("BOXMOD IS BLOCKED!!!"); } else { //delay(200); waitblink = 1; for(int i=0; i<5; i++) { digitalWrite(LED_BUILTIN, HIGH); delay(200); digitalWrite(LED_BUILTIN, LOW); delay(200); } waitblink = 0; block = 0; Serial.print("BOXMOD UNLOCKED!!!"); } } if(block == 0) { digitalWrite(LED_BUILTIN, HIGH); digitalWrite(mosfet_pin, HIGH); //ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ мосфСт Serial.print("FIRE!!!"); Serial.print("Press count: "); Serial.println(presscount, 3); Serial.print("Wait blink: "); Serial.println(waitblink, 3); } presscount ++; lastshot=millis(); //Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ врСмя послСднСго наТатия (для Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° сна) flag=1; //ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„Π»Π°ΠΆΠΎΠΊ, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π° } // этот кусок Π΄Π°Ρ‘Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΡΠΏΠ°Ρ‚ΡŒ if (millis()-lastshot > 300) //Ссли послС послСднСго Π½Π°ΠΆΠ°Ρ‚ΠΈΡ‡ ΠΏΡ€ΠΎΡˆΠ»ΠΎ большС 3 сСкунд { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Π²Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΆΠΈΠΌΠ° энСргопотрСблСния sleep_mode(); // ΡƒΡ…ΠΎΠ΄ΠΈΠΌ Π² спячку presscount = 0; } // этот кусок Π΄Π°Ρ‘Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΡΠΏΠ°Ρ‚ΡŒ delay(1); //Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° для ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ } void calibration() { //--------ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΊΠ°---------- for (byte i = 0; i < 7; i++) EEPROM.writeInt(i, 0); // чистим EEPROM для своих Π½ΡƒΠΆΠ΄ my_vcc_const = 1.1; Serial.print("Real VCC is: "); Serial.println(readVcc()); // общаСмся с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Serial.println("Write your VCC (in millivolts)"); while (Serial.available() == 0); int Vcc = Serial.parseInt(); // напряТСниС ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ float real_const = (float)1.1 * Vcc / readVcc(); // расчёт константы Serial.print("New voltage constant: "); Serial.println(real_const, 3); EEPROM.writeFloat(8, real_const); // запись Π² EEPROM while (1); // ΡƒΠΉΡ‚ΠΈ Π² бСсконСчный Ρ†ΠΈΠΊΠ» //------ΠΊΠΎΠ½Π΅Ρ† ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΊΠΈ------- } long readVcc() { //функция чтСния Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ напряТСния, ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ (для всСх Π°Ρ€Π΄ΡƒΠΈΠ½) #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(2); // 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 = my_vcc_const * 1023 * 1000 / result; // расчёт Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ VCC return result; // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ VCC } 

Video for clarity: https://vk.com/video16479439_456239166

Closed due to the fact that off-topic participants Denis Bubnov , user194374, ermak0ff , Vadizar , Yuri 4 Mar '17 at 21:59 .

It seems that this question does not correspond to the subject of the site. Those who voted to close it indicated the following reason:

  • β€œQuestions asking for help with debugging (β€œ why does this code not work? ”) Should include the desired behavior, a specific problem or error, and a minimum code for playing it right in the question . Questions without an explicit description of the problem are useless for other visitors. See How to create minimal, self-sufficient and reproducible example . " - Denis Bubnov, Community Spirit, ermak0ff, Vadizar, Yuri
If the question can be reformulated according to the rules set out in the certificate , edit it .

    0