diff --git a/.vscode/arduino.json b/.vscode/arduino.json new file mode 100644 index 0000000..fa79323 --- /dev/null +++ b/.vscode/arduino.json @@ -0,0 +1,6 @@ +{ + "configuration": "cpu=atmega328", + "board": "arduino:avr:nano", + "port": "/dev/ttyUSB0", + "sketch": "feeder.ino" +} \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..8a23e9c --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,539 @@ +{ + "version": 4, + "configurations": [ + { + "name": "Arduino", + "compilerPath": "/home/aarizona/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++", + "compilerArgs": [ + "-w", + "-std=gnu++11", + "-fpermissive", + "-fno-exceptions", + "-ffunction-sections", + "-fdata-sections", + "-fno-threadsafe-statics", + "-Wno-error=narrowing" + ], + "intelliSenseMode": "gcc-x64", + "includePath": [ + "/home/aarizona/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino", + "/home/aarizona/.arduino15/packages/arduino/hardware/avr/1.8.6/variants/eightanaloginputs", + "/home/aarizona/.arduino15/packages/arduino/hardware/avr/1.8.6/libraries/EEPROM/src", + "/home/aarizona/.arduino15/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src", + "/home/aarizona/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/lib/gcc/avr/7.3.0/include", + "/home/aarizona/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/lib/gcc/avr/7.3.0/include-fixed", + "/home/aarizona/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/include" + ], + "forcedInclude": [ + "/home/aarizona/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Arduino.h" + ], + "cStandard": "c11", + "cppStandard": "c++11", + "defines": [ + "F_CPU=16000000L", + "ARDUINO=10607", + "ARDUINO_AVR_NANO", + "ARDUINO_ARCH_AVR", + "__DBL_MIN_EXP__=(-125)", + "__HQ_FBIT__=15", + "__cpp_attributes=200809", + "__UINT_LEAST16_MAX__=0xffffU", + "__ATOMIC_ACQUIRE=2", + "__SFRACT_IBIT__=0", + "__FLT_MIN__=1.17549435e-38F", + "__GCC_IEC_559_COMPLEX=0", + "__BUILTIN_AVR_SLEEP=1", + "__BUILTIN_AVR_COUNTLSULLK=1", + "__cpp_aggregate_nsdmi=201304", + "__BUILTIN_AVR_COUNTLSULLR=1", + "__UFRACT_MAX__=0XFFFFP-16UR", + "__UINT_LEAST8_TYPE__=unsigned char", + "__DQ_FBIT__=63", + "__INTMAX_C(c)=c ## LL", + "__ULFRACT_FBIT__=32", + "__SACCUM_EPSILON__=0x1P-7HK", + "__CHAR_BIT__=8", + "__USQ_IBIT__=0", + "__UINT8_MAX__=0xff", + "__ACCUM_FBIT__=15", + "__WINT_MAX__=0x7fff", + "__FLT32_MIN_EXP__=(-125)", + "__cpp_static_assert=200410", + "__USFRACT_FBIT__=8", + "__ORDER_LITTLE_ENDIAN__=1234", + "__SIZE_MAX__=0xffffU", + "__WCHAR_MAX__=0x7fff", + "__LACCUM_IBIT__=32", + "__DBL_DENORM_MIN__=double(1.40129846e-45L)", + "__GCC_ATOMIC_CHAR_LOCK_FREE=1", + "__GCC_IEC_559=0", + "__FLT_EVAL_METHOD__=0", + "__BUILTIN_AVR_LLKBITS=1", + "__cpp_binary_literals=201304", + "__LLACCUM_MAX__=0X7FFFFFFFFFFFFFFFP-47LLK", + "__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1", + "__BUILTIN_AVR_HKBITS=1", + "__BUILTIN_AVR_BITSLLK=1", + "__FRACT_FBIT__=15", + "__BUILTIN_AVR_BITSLLR=1", + "__cpp_variadic_templates=200704", + "__UINT_FAST64_MAX__=0xffffffffffffffffULL", + "__SIG_ATOMIC_TYPE__=char", + "__BUILTIN_AVR_UHKBITS=1", + "__UACCUM_FBIT__=16", + "__DBL_MIN_10_EXP__=(-37)", + "__FINITE_MATH_ONLY__=0", + "__cpp_variable_templates=201304", + "__LFRACT_IBIT__=0", + "__GNUC_PATCHLEVEL__=0", + "__FLT32_HAS_DENORM__=1", + "__LFRACT_MAX__=0X7FFFFFFFP-31LR", + "__UINT_FAST8_MAX__=0xff", + "__has_include(STR)=__has_include__(STR)", + "__DEC64_MAX_EXP__=385", + "__INT8_C(c)=c", + "__INT_LEAST8_WIDTH__=8", + "__UINT_LEAST64_MAX__=0xffffffffffffffffULL", + "__SA_FBIT__=15", + "__SHRT_MAX__=0x7fff", + "__LDBL_MAX__=3.40282347e+38L", + "__FRACT_MAX__=0X7FFFP-15R", + "__UFRACT_FBIT__=16", + "__UFRACT_MIN__=0.0UR", + "__UINT_LEAST8_MAX__=0xff", + "__GCC_ATOMIC_BOOL_LOCK_FREE=1", + "__UINTMAX_TYPE__=long long unsigned int", + "__LLFRACT_EPSILON__=0x1P-63LLR", + "__BUILTIN_AVR_DELAY_CYCLES=1", + "__DEC32_EPSILON__=1E-6DF", + "__FLT_EVAL_METHOD_TS_18661_3__=0", + "__UINT32_MAX__=0xffffffffUL", + "__GXX_EXPERIMENTAL_CXX0X__=1", + "__ULFRACT_MAX__=0XFFFFFFFFP-32ULR", + "__TA_IBIT__=16", + "__LDBL_MAX_EXP__=128", + "__WINT_MIN__=(-__WINT_MAX__ - 1)", + "__INT_LEAST16_WIDTH__=16", + "__ULLFRACT_MIN__=0.0ULLR", + "__SCHAR_MAX__=0x7f", + "__WCHAR_MIN__=(-__WCHAR_MAX__ - 1)", + "__INT64_C(c)=c ## LL", + "__DBL_DIG__=6", + "__GCC_ATOMIC_POINTER_LOCK_FREE=1", + "__AVR_HAVE_SPH__=1", + "__LLACCUM_MIN__=(-0X1P15LLK-0X1P15LLK)", + "__BUILTIN_AVR_KBITS=1", + "__BUILTIN_AVR_ABSK=1", + "__BUILTIN_AVR_ABSR=1", + "__SIZEOF_INT__=2", + "__SIZEOF_POINTER__=2", + "__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1", + "__USACCUM_IBIT__=8", + "__USER_LABEL_PREFIX__", + "__STDC_HOSTED__=1", + "__LDBL_HAS_INFINITY__=1", + "__LFRACT_MIN__=(-0.5LR-0.5LR)", + "__HA_IBIT__=8", + "__FLT32_DIG__=6", + "__TQ_IBIT__=0", + "__FLT_EPSILON__=1.19209290e-7F", + "__GXX_WEAK__=1", + "__SHRT_WIDTH__=16", + "__USFRACT_IBIT__=0", + "__LDBL_MIN__=1.17549435e-38L", + "__FRACT_MIN__=(-0.5R-0.5R)", + "__AVR_SFR_OFFSET__=0x20", + "__DEC32_MAX__=9.999999E96DF", + "__cpp_threadsafe_static_init=200806", + "__DA_IBIT__=32", + "__INT32_MAX__=0x7fffffffL", + "__UQQ_FBIT__=8", + "__INT_WIDTH__=16", + "__SIZEOF_LONG__=4", + "__UACCUM_MAX__=0XFFFFFFFFP-16UK", + "__UINT16_C(c)=c ## U", + "__PTRDIFF_WIDTH__=16", + "__DECIMAL_DIG__=9", + "__LFRACT_EPSILON__=0x1P-31LR", + "__AVR_2_BYTE_PC__=1", + "__ULFRACT_MIN__=0.0ULR", + "__INTMAX_WIDTH__=64", + "__has_include_next(STR)=__has_include_next__(STR)", + "__BUILTIN_AVR_ULLRBITS=1", + "__LDBL_HAS_QUIET_NAN__=1", + "__ULACCUM_IBIT__=32", + "__UACCUM_EPSILON__=0x1P-16UK", + "__BUILTIN_AVR_SEI=1", + "__GNUC__=7", + "__ULLACCUM_MAX__=0XFFFFFFFFFFFFFFFFP-48ULLK", + "__cpp_delegating_constructors=200604", + "__HQ_IBIT__=0", + "__BUILTIN_AVR_SWAP=1", + "__FLT_HAS_DENORM__=1", + "__SIZEOF_LONG_DOUBLE__=4", + "__BIGGEST_ALIGNMENT__=1", + "__STDC_UTF_16__=1", + "__UINT24_MAX__=16777215UL", + "__BUILTIN_AVR_NOP=1", + "__GNUC_STDC_INLINE__=1", + "__DQ_IBIT__=0", + "__FLT32_HAS_INFINITY__=1", + "__DBL_MAX__=double(3.40282347e+38L)", + "__ULFRACT_IBIT__=0", + "__cpp_raw_strings=200710", + "__INT_FAST32_MAX__=0x7fffffffL", + "__DBL_HAS_INFINITY__=1", + "__INT64_MAX__=0x7fffffffffffffffLL", + "__ACCUM_IBIT__=16", + "__DEC32_MIN_EXP__=(-94)", + "__BUILTIN_AVR_UKBITS=1", + "__INTPTR_WIDTH__=16", + "__BUILTIN_AVR_FMULSU=1", + "__LACCUM_MAX__=0X7FFFFFFFFFFFFFFFP-31LK", + "__INT_FAST16_TYPE__=int", + "__LDBL_HAS_DENORM__=1", + "__BUILTIN_AVR_BITSK=1", + "__BUILTIN_AVR_BITSR=1", + "__cplusplus=201402L", + "__cpp_ref_qualifiers=200710", + "__DEC128_MAX__=9.999999999999999999999999999999999E6144DL", + "__INT_LEAST32_MAX__=0x7fffffffL", + "__USING_SJLJ_EXCEPTIONS__=1", + "__DEC32_MIN__=1E-95DF", + "__ACCUM_MAX__=0X7FFFFFFFP-15K", + "__DEPRECATED=1", + "__cpp_rvalue_references=200610", + "__DBL_MAX_EXP__=128", + "__USACCUM_EPSILON__=0x1P-8UHK", + "__WCHAR_WIDTH__=16", + "__FLT32_MAX__=3.40282347e+38F32", + "__DEC128_EPSILON__=1E-33DL", + "__SFRACT_MAX__=0X7FP-7HR", + "__FRACT_IBIT__=0", + "__PTRDIFF_MAX__=0x7fff", + "__UACCUM_MIN__=0.0UK", + "__UACCUM_IBIT__=16", + "__BUILTIN_AVR_NOPS=1", + "__BUILTIN_AVR_WDR=1", + "__FLT32_HAS_QUIET_NAN__=1", + "__GNUG__=7", + "__LONG_LONG_MAX__=0x7fffffffffffffffLL", + "__SIZEOF_SIZE_T__=2", + "__ULACCUM_MAX__=0XFFFFFFFFFFFFFFFFP-32ULK", + "__cpp_rvalue_reference=200610", + "__cpp_nsdmi=200809", + "__SIZEOF_WINT_T__=2", + "__LONG_LONG_WIDTH__=64", + "__cpp_initializer_lists=200806", + "__FLT32_MAX_EXP__=128", + "__SA_IBIT__=16", + "__ULLACCUM_MIN__=0.0ULLK", + "__BUILTIN_AVR_ROUNDUHK=1", + "__BUILTIN_AVR_ROUNDUHR=1", + "__cpp_hex_float=201603", + "__GXX_ABI_VERSION=1011", + "__INT24_MAX__=8388607L", + "__UTA_FBIT__=48", + "__FLT_MIN_EXP__=(-125)", + "__USFRACT_MAX__=0XFFP-8UHR", + "__UFRACT_IBIT__=0", + "__BUILTIN_AVR_ROUNDFX=1", + "__BUILTIN_AVR_ROUNDULK=1", + "__BUILTIN_AVR_ROUNDULR=1", + "__cpp_lambdas=200907", + "__BUILTIN_AVR_COUNTLSLLK=1", + "__BUILTIN_AVR_COUNTLSLLR=1", + "__BUILTIN_AVR_ROUNDHK=1", + "__INT_FAST64_TYPE__=long long int", + "__BUILTIN_AVR_ROUNDHR=1", + "__DBL_MIN__=double(1.17549435e-38L)", + "__BUILTIN_AVR_COUNTLSK=1", + "__BUILTIN_AVR_ROUNDLK=1", + "__BUILTIN_AVR_COUNTLSR=1", + "__BUILTIN_AVR_ROUNDLR=1", + "__LACCUM_MIN__=(-0X1P31LK-0X1P31LK)", + "__ULLACCUM_FBIT__=48", + "__BUILTIN_AVR_LKBITS=1", + "__ULLFRACT_EPSILON__=0x1P-64ULLR", + "__DEC128_MIN__=1E-6143DL", + "__REGISTER_PREFIX__", + "__UINT16_MAX__=0xffffU", + "__DBL_HAS_DENORM__=1", + "__BUILTIN_AVR_ULKBITS=1", + "__ACCUM_MIN__=(-0X1P15K-0X1P15K)", + "__AVR_ARCH__=2", + "__SQ_IBIT__=0", + "__FLT32_MIN__=1.17549435e-38F32", + "__UINT8_TYPE__=unsigned char", + "__BUILTIN_AVR_ROUNDUK=1", + "__BUILTIN_AVR_ROUNDUR=1", + "__UHA_FBIT__=8", + "__NO_INLINE__=1", + "__SFRACT_MIN__=(-0.5HR-0.5HR)", + "__UTQ_FBIT__=128", + "__FLT_MANT_DIG__=24", + "__LDBL_DECIMAL_DIG__=9", + "__VERSION__=\"7.3.0\"", + "__UINT64_C(c)=c ## ULL", + "__ULLFRACT_FBIT__=64", + "__cpp_unicode_characters=200704", + "__FRACT_EPSILON__=0x1P-15R", + "__ULACCUM_MIN__=0.0ULK", + "__UDA_FBIT__=32", + "__cpp_decltype_auto=201304", + "__LLACCUM_EPSILON__=0x1P-47LLK", + "__GCC_ATOMIC_INT_LOCK_FREE=1", + "__FLT32_MANT_DIG__=24", + "__BUILTIN_AVR_BITSUHK=1", + "__BUILTIN_AVR_BITSUHR=1", + "__FLOAT_WORD_ORDER__=__ORDER_LITTLE_ENDIAN__", + "__USFRACT_MIN__=0.0UHR", + "__BUILTIN_AVR_BITSULK=1", + "__ULLACCUM_IBIT__=16", + "__BUILTIN_AVR_BITSULR=1", + "__UQQ_IBIT__=0", + "__BUILTIN_AVR_LLRBITS=1", + "__SCHAR_WIDTH__=8", + "__BUILTIN_AVR_BITSULLK=1", + "__BUILTIN_AVR_BITSULLR=1", + "__INT32_C(c)=c ## L", + "__DEC64_EPSILON__=1E-15DD", + "__ORDER_PDP_ENDIAN__=3412", + "__DEC128_MIN_EXP__=(-6142)", + "__UHQ_FBIT__=16", + "__LLACCUM_FBIT__=47", + "__FLT32_MAX_10_EXP__=38", + "__BUILTIN_AVR_ROUNDULLK=1", + "__BUILTIN_AVR_ROUNDULLR=1", + "__INT_FAST32_TYPE__=long int", + "__BUILTIN_AVR_HRBITS=1", + "__UINT_LEAST16_TYPE__=unsigned int", + "__BUILTIN_AVR_UHRBITS=1", + "__INT16_MAX__=0x7fff", + "__SIZE_TYPE__=unsigned int", + "__UINT64_MAX__=0xffffffffffffffffULL", + "__UDQ_FBIT__=64", + "__INT8_TYPE__=signed char", + "__cpp_digit_separators=201309", + "__ELF__=1", + "__ULFRACT_EPSILON__=0x1P-32ULR", + "__LLFRACT_FBIT__=63", + "__FLT_RADIX__=2", + "__INT_LEAST16_TYPE__=int", + "__BUILTIN_AVR_ABSFX=1", + "__LDBL_EPSILON__=1.19209290e-7L", + "__UINTMAX_C(c)=c ## ULL", + "__INT24_MIN__=(-__INT24_MAX__-1)", + "__SACCUM_MAX__=0X7FFFP-7HK", + "__BUILTIN_AVR_ABSHR=1", + "__SIG_ATOMIC_MAX__=0x7f", + "__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1", + "__cpp_sized_deallocation=201309", + "__SIZEOF_PTRDIFF_T__=2", + "__AVR=1", + "__BUILTIN_AVR_ABSLK=1", + "__BUILTIN_AVR_ABSLR=1", + "__LACCUM_EPSILON__=0x1P-31LK", + "__DEC32_SUBNORMAL_MIN__=0.000001E-95DF", + "__INT_FAST16_MAX__=0x7fff", + "__UINT_FAST32_MAX__=0xffffffffUL", + "__UINT_LEAST64_TYPE__=long long unsigned int", + "__USACCUM_MAX__=0XFFFFP-8UHK", + "__SFRACT_EPSILON__=0x1P-7HR", + "__FLT_HAS_QUIET_NAN__=1", + "__FLT_MAX_10_EXP__=38", + "__LONG_MAX__=0x7fffffffL", + "__DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL", + "__FLT_HAS_INFINITY__=1", + "__cpp_unicode_literals=200710", + "__USA_FBIT__=16", + "__UINT_FAST16_TYPE__=unsigned int", + "__DEC64_MAX__=9.999999999999999E384DD", + "__INT_FAST32_WIDTH__=32", + "__BUILTIN_AVR_RBITS=1", + "__CHAR16_TYPE__=unsigned int", + "__PRAGMA_REDEFINE_EXTNAME=1", + "__SIZE_WIDTH__=16", + "__INT_LEAST16_MAX__=0x7fff", + "__DEC64_MANT_DIG__=16", + "__UINT_LEAST32_MAX__=0xffffffffUL", + "__SACCUM_FBIT__=7", + "__FLT32_DENORM_MIN__=1.40129846e-45F32", + "__GCC_ATOMIC_LONG_LOCK_FREE=1", + "__SIG_ATOMIC_WIDTH__=8", + "__INT_LEAST64_TYPE__=long long int", + "__INT16_TYPE__=int", + "__INT_LEAST8_TYPE__=signed char", + "__SQ_FBIT__=31", + "__DEC32_MAX_EXP__=97", + "__INT_FAST8_MAX__=0x7f", + "__INTPTR_MAX__=0x7fff", + "__QQ_FBIT__=7", + "__cpp_range_based_for=200907", + "__UTA_IBIT__=16", + "__AVR_ERRATA_SKIP__=1", + "__FLT32_MIN_10_EXP__=(-37)", + "__LDBL_MANT_DIG__=24", + "__SFRACT_FBIT__=7", + "__SACCUM_MIN__=(-0X1P7HK-0X1P7HK)", + "__DBL_HAS_QUIET_NAN__=1", + "__SIG_ATOMIC_MIN__=(-__SIG_ATOMIC_MAX__ - 1)", + "AVR=1", + "__BUILTIN_AVR_FMULS=1", + "__cpp_return_type_deduction=201304", + "__INTPTR_TYPE__=int", + "__UINT16_TYPE__=unsigned int", + "__WCHAR_TYPE__=int", + "__SIZEOF_FLOAT__=4", + "__AVR__=1", + "__BUILTIN_AVR_INSERT_BITS=1", + "__USQ_FBIT__=32", + "__UINTPTR_MAX__=0xffffU", + "__INT_FAST64_WIDTH__=64", + "__DEC64_MIN_EXP__=(-382)", + "__cpp_decltype=200707", + "__FLT32_DECIMAL_DIG__=9", + "__INT_FAST64_MAX__=0x7fffffffffffffffLL", + "__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1", + "__FLT_DIG__=6", + "__UINT_FAST64_TYPE__=long long unsigned int", + "__BUILTIN_AVR_BITSHK=1", + "__BUILTIN_AVR_BITSHR=1", + "__INT_MAX__=0x7fff", + "__LACCUM_FBIT__=31", + "__USACCUM_MIN__=0.0UHK", + "__UHA_IBIT__=8", + "__INT64_TYPE__=long long int", + "__BUILTIN_AVR_BITSLK=1", + "__BUILTIN_AVR_BITSLR=1", + "__FLT_MAX_EXP__=128", + "__UTQ_IBIT__=0", + "__DBL_MANT_DIG__=24", + "__cpp_inheriting_constructors=201511", + "__BUILTIN_AVR_ULLKBITS=1", + "__INT_LEAST64_MAX__=0x7fffffffffffffffLL", + "__DEC64_MIN__=1E-383DD", + "__WINT_TYPE__=int", + "__UINT_LEAST32_TYPE__=long unsigned int", + "__SIZEOF_SHORT__=2", + "__ULLFRACT_IBIT__=0", + "__LDBL_MIN_EXP__=(-125)", + "__UDA_IBIT__=32", + "__WINT_WIDTH__=16", + "__INT_LEAST8_MAX__=0x7f", + "__LFRACT_FBIT__=31", + "__LDBL_MAX_10_EXP__=38", + "__ATOMIC_RELAXED=0", + "__DBL_EPSILON__=double(1.19209290e-7L)", + "__BUILTIN_AVR_BITSUK=1", + "__BUILTIN_AVR_BITSUR=1", + "__UINT8_C(c)=c", + "__INT_LEAST32_TYPE__=long int", + "__BUILTIN_AVR_URBITS=1", + "__SIZEOF_WCHAR_T__=2", + "__LLFRACT_MAX__=0X7FFFFFFFFFFFFFFFP-63LLR", + "__TQ_FBIT__=127", + "__INT_FAST8_TYPE__=signed char", + "__ULLACCUM_EPSILON__=0x1P-48ULLK", + "__BUILTIN_AVR_ROUNDK=1", + "__BUILTIN_AVR_ROUNDR=1", + "__UHQ_IBIT__=0", + "__LLACCUM_IBIT__=16", + "__FLT32_EPSILON__=1.19209290e-7F32", + "__DBL_DECIMAL_DIG__=9", + "__STDC_UTF_32__=1", + "__INT_FAST8_WIDTH__=8", + "__DEC_EVAL_METHOD__=2", + "__TA_FBIT__=47", + "__UDQ_IBIT__=0", + "__ORDER_BIG_ENDIAN__=4321", + "__cpp_runtime_arrays=198712", + "__WITH_AVRLIBC__=1", + "__UINT64_TYPE__=long long unsigned int", + "__ACCUM_EPSILON__=0x1P-15K", + "__UINT32_C(c)=c ## UL", + "__BUILTIN_AVR_COUNTLSUHK=1", + "__INTMAX_MAX__=0x7fffffffffffffffLL", + "__cpp_alias_templates=200704", + "__BUILTIN_AVR_COUNTLSUHR=1", + "__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__", + "__FLT_DENORM_MIN__=1.40129846e-45F", + "__LLFRACT_IBIT__=0", + "__INT8_MAX__=0x7f", + "__LONG_WIDTH__=32", + "__UINT_FAST32_TYPE__=long unsigned int", + "__CHAR32_TYPE__=long unsigned int", + "__BUILTIN_AVR_COUNTLSULK=1", + "__BUILTIN_AVR_COUNTLSULR=1", + "__FLT_MAX__=3.40282347e+38F", + "__cpp_constexpr=201304", + "__USACCUM_FBIT__=8", + "__BUILTIN_AVR_COUNTLSFX=1", + "__INT32_TYPE__=long int", + "__SIZEOF_DOUBLE__=4", + "__FLT_MIN_10_EXP__=(-37)", + "__UFRACT_EPSILON__=0x1P-16UR", + "__INT_LEAST32_WIDTH__=32", + "__BUILTIN_AVR_COUNTLSHK=1", + "__BUILTIN_AVR_COUNTLSHR=1", + "__INTMAX_TYPE__=long long int", + "__BUILTIN_AVR_ABSLLK=1", + "__BUILTIN_AVR_ABSLLR=1", + "__DEC128_MAX_EXP__=6145", + "__AVR_HAVE_16BIT_SP__=1", + "__ATOMIC_CONSUME=1", + "__GNUC_MINOR__=3", + "__INT_FAST16_WIDTH__=16", + "__UINTMAX_MAX__=0xffffffffffffffffULL", + "__DEC32_MANT_DIG__=7", + "__HA_FBIT__=7", + "__BUILTIN_AVR_COUNTLSLK=1", + "__BUILTIN_AVR_COUNTLSLR=1", + "__BUILTIN_AVR_CLI=1", + "__DBL_MAX_10_EXP__=38", + "__LDBL_DENORM_MIN__=1.40129846e-45L", + "__INT16_C(c)=c", + "__cpp_generic_lambdas=201304", + "__STDC__=1", + "__PTRDIFF_TYPE__=int", + "__LLFRACT_MIN__=(-0.5LLR-0.5LLR)", + "__BUILTIN_AVR_LRBITS=1", + "__ATOMIC_SEQ_CST=5", + "__DA_FBIT__=31", + "__UINT32_TYPE__=long unsigned int", + "__BUILTIN_AVR_ROUNDLLK=1", + "__UINTPTR_TYPE__=unsigned int", + "__BUILTIN_AVR_ROUNDLLR=1", + "__USA_IBIT__=16", + "__BUILTIN_AVR_ULRBITS=1", + "__DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD", + "__DEC128_MANT_DIG__=34", + "__LDBL_MIN_10_EXP__=(-37)", + "__BUILTIN_AVR_COUNTLSUK=1", + "__BUILTIN_AVR_COUNTLSUR=1", + "__SIZEOF_LONG_LONG__=8", + "__ULACCUM_EPSILON__=0x1P-32ULK", + "__cpp_user_defined_literals=200809", + "__SACCUM_IBIT__=8", + "__GCC_ATOMIC_LLONG_LOCK_FREE=1", + "__LDBL_DIG__=6", + "__FLT_DECIMAL_DIG__=9", + "__UINT_FAST16_MAX__=0xffffU", + "__GCC_ATOMIC_SHORT_LOCK_FREE=1", + "__BUILTIN_AVR_ABSHK=1", + "__BUILTIN_AVR_FLASH_SEGMENT=1", + "__INT_LEAST64_WIDTH__=64", + "__ULLFRACT_MAX__=0XFFFFFFFFFFFFFFFFP-64ULLR", + "__UINT_FAST8_TYPE__=unsigned char", + "__USFRACT_EPSILON__=0x1P-8UHR", + "__ULACCUM_FBIT__=32", + "__QQ_IBIT__=0", + "__cpp_init_captures=201304", + "__ATOMIC_ACQ_REL=4", + "__ATOMIC_RELEASE=3", + "__BUILTIN_AVR_FMUL=1", + "USBCON" + ] + } + ] +} \ No newline at end of file diff --git a/feeder.ino b/feeder.ino new file mode 100644 index 0000000..fee27a6 --- /dev/null +++ b/feeder.ino @@ -0,0 +1,247 @@ +/* + Скетч к проекту "Спутниковая Роботорговля" +bgp, 2023 +*/ + +#define EE_RESET 26 // любое число 0-255. Измени, чтобы сбросить настройки и обновить время +#define FEED_SPEED 1500 // задержка между шагами мотора (мкс) +#define DIRPIN 2 // d2 направление +#define STEPPIN 3 // d3 движение +#define BTN_PIN 4 // кнопка выдачи +#define BUNKERPIN 5 // d5 датчик наличия корма +#define HANDPIN 6 // d6 датчик наличия руки +#define TERM_INHIB 8 // d8 посылать "отказ от обслуживания" -upd +#define TERM_COIN 7 // d7 считаем монетки - upd +#define SLEEP 9 // d9 пока не работаем - двигатель спит +#define RELAY 10 // d10 ключ для отключения терминала и двигателя в ночное время +#define BTN_PIN2 11 // кнопка настройки +// 773 - шаги на один полный круг +// 3 - количество выемок в одном круге +// 258 = 773/3 +#define STEPS_FRW 258 // шаги вперёд +#define STEPS_BKW 0 // шаги назад + +// ========================================================= +#include +#include "microDS3231.h" +MicroDS3231 rtc; +#include "EncButton.h" + +EncButton btn; +EncButton btn_setup; +EncButton term_inhib; +// EncButton term_coin_put; +int feedAmount = 1; + +// https://robotchip.ru/podklyuchenie-kupyuropriemnika-cashcode-sm-k-arduino/ + +int valuePulse = 10; // Стоимость одного импульса +int minWidthPulse = 80; // Минимальная ширина одного импульса +int maxWidthPulse = 120; // Максимальная ширина одного импульса +int debounce = 4; // Защита от помех +int pulseCount = 0; // Сколько импульсов получено +int receivedRUB = 0; // Сумма +unsigned long pulseDuration; // Как давно был последний импульс +unsigned long pulseBegin = 0; // Начало импульса +unsigned long pulseEnd = 0; // Конец импульса +unsigned long curtime; // Время +int postPulsePause = 300; // Время ожидания, для завершения подсчета импульсов +int pulseState; // Состояние входа "0" или "1" +int lastState = 1; // Последние состояние входа "0" или "1" + +int paymentsCount = 0; + +int onTime = 6; // время включения +int offTime = 20; // время выключения + +unsigned long sleepTime; // переменная для задания времени сна + +int monitor_speed = 9600; + +// GND -- [ R2 ] -- A0 -- [ R1 ] -- VIN +#define VREF 4.5 // точное напряжение на пине 5V (в данном случае зависит от стабилизатора на плате Arduino) +#define DIV_R1 6800 // точное значение 6.80 кОм резистора +#define DIV_R2 1100 // точное значение 1.1 кОм резистора + +#define DEBUG true + +void setup() +{ + rtc.begin(); + if (EEPROM.read(0) != EE_RESET) + { // первый запуск + EEPROM.write(0, EE_RESET); + EEPROM.put(1, feedAmount); + rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR); + } + EEPROM.get(1, feedAmount); + pinMode(STEPPIN, OUTPUT); // пин движения + pinMode(DIRPIN, OUTPUT); // пин направления + pinMode(HANDPIN, INPUT); // пин ИК датчик руки + pinMode(BUNKERPIN, INPUT); // пин ИК датчик бункер + pinMode(LED_BUILTIN, OUTPUT); // встроенный LED + pinMode(SLEEP, OUTPUT); // пин для отключения двигателя + pinMode(TERM_COIN, INPUT); // прием сигнала от терминала + pinMode(RELAY, OUTPUT); + + sleepTime = 60 * 60 * 1000; + // Debug + if (DEBUG) + { + Serial.begin(monitor_speed); // debug в serial + sleepTime = 10 * 1000; + } +} + +void loop() +{ + static uint32_t tmr = 0; + float voltage = (float)analogRead(0) * VREF * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024; + if (millis() - tmr > 500) + { // два раза в секунду + static byte prevMin = 0; + tmr = millis(); + DateTime now = rtc.getTime(); + if (DEBUG) + { + // получаем время + Serial.println(String(voltage) + " V"); // debug + Serial.println(String(now.hour) + " h"); // debug + String str_time = String(rtc.getHours()) + ":" + String(rtc.getMinutes()) + ":" + String(rtc.getSeconds()); + String date_time = String(rtc.getDate()) + "-" + String(rtc.getMonth()) + "-" + String(rtc.getYear()); + Serial.println(str_time + " " + date_time); + } + if (voltage < 31) + { + digitalWrite(RELAY, LOW); + delay(sleepTime); + } + if ((now.hour >= onTime && now.hour < offTime && voltage > 31)) + { //&& voltage > 10.2 + digitalWrite(RELAY, HIGH); // работаем если время рабочее И напряжение выше минимума + } + else + { + digitalWrite(RELAY, LOW); + } + } + + digitalWrite(TERM_INHIB, term_inhib.isHold() == 0); + + btn.tick(); + btn_setup.tick(); + term_inhib.tick(); + + pulseState = digitalRead(TERM_COIN); // Считываем значение с входа TERM_COIN + curtime = millis(); // Записываем значение миллисекунд с момента начала выполнения программы + + if ((pulseState == 0) && (lastState == 1)) // Ждем начало импульса, логический "0" + { + pulseBegin = curtime; // Записываем значение милисикунд + lastState = 0; // Записываем значение "0" в переменную lastState + } + else if ((pulseState == 1) && (lastState == 0)) // Ждем окончания импульса, логический "1" + { + pulseDuration = curtime - pulseBegin; // Расчет длительности импульса в миллисекунд + if (pulseDuration > debounce) // Защита от помех, если импульс был небольшой + { + lastState = 1; // Записываем значение "1" в переменную lastState + } + if ((pulseDuration > minWidthPulse) && (pulseDuration < maxWidthPulse)) // Проверяем ширину импульса + { + pulseEnd = curtime; // Сохранить значение милисикунд, окончания импульса + pulseCount++; // Инкремент счетчика импульсов + } + } + if ((pulseEnd > 0) && (curtime - pulseEnd > postPulsePause)) // Проверяем, поступают ли еще импульсы + { + receivedRUB += pulseCount * valuePulse; // Расчет суммы + if (receivedRUB > 0) + { + paymentsCount++; // Надо описать логику, "принимаем платежи сколько угодно раз и кормим сстолько же, как только в кадре появятся руки" + Serial.print("Credit: "); // Вывести текст на последовательный порт //Debug + Serial.print(receivedRUB); // Вывести значение переменной на пслеовательный порт //Debug + Serial.println(" RUB"); // Вывести текст на последовательный порт //Debug + Serial.print("Payed: "); + Serial.print(paymentsCount); + Serial.println(" times"); + pulseEnd = 0; // Обнуляем + pulseCount = 0; // Обнуляем + receivedRUB = 0; // Обнуляем + } + } + + if (paymentsCount > 0) // Debug подставляем руки, жмем кнопку - получаем внеочередную кормежку + { + feed(); + paymentsCount--; + Serial.print("Payed: "); + Serial.print(paymentsCount); + Serial.println(" times"); + } + + if (btn.click()) + { + feed(); + } + + if (btn_setup.hold()) + { + feedAmount = 1; + EEPROM.put(1, feedAmount); + } + if (btn_setup.click()) // Задаем размер порции: + { + feedAmount += 1; + EEPROM.put(1, feedAmount); // записываем количество шагов в постоянную память + } + +} // конец основного цикла + +// выдача корма +void feed() +{ + for (int i = 0; i < feedAmount; i++) + oneRev(); + disableMotor(); +} + +// кормежка по кнопке +void feedByButton() +{ + if (btn.click()) + { + feed(); + } +} + +// выключаем ток на мотор +void disableMotor() +{ + digitalWrite(SLEEP, LOW); +} + +// вращение +void runMotor() +{ + digitalWrite(SLEEP, HIGH); // Включаем мотор + digitalWrite(STEPPIN, HIGH); // по часовой + delayMicroseconds(FEED_SPEED); + digitalWrite(STEPPIN, LOW); // против часовой + delayMicroseconds(FEED_SPEED); +} + +// вращение двигателя в виброрежиме, для непопущения заклинивания +void oneRev() +{ + for (int i = 0; i < STEPS_BKW; i++) + { + digitalWrite(DIRPIN, HIGH); // low обратное вращение + runMotor(); + } + for (int i = 0; i < STEPS_FRW; i++) + { + digitalWrite(DIRPIN, LOW); + runMotor(); + } +} diff --git a/feeder_v2.1.ino b/feeder_v2.1.ino deleted file mode 100644 index 5cb94b5..0000000 --- a/feeder_v2.1.ino +++ /dev/null @@ -1,251 +0,0 @@ -/* - Скетч к проекту "Спутниковая Роботорговля" -bgp, 2023 -*/ - - -#define EE_RESET 15 // любое число 0-255. Измени, чтобы сбросить настройки и обновить время -#define FEED_SPEED 1500 // задержка между шагами мотора (мкс) -#define DIRPIN 2 // d2 направление -#define STEPPIN 3 // d3 движение -#define BTN_PIN 4 // кнопка выдачи -#define BUNKERPIN 5 // d5 датчик наличия корма -#define HANDPIN 6 // d6 датчик наличия руки -#define TERM_INHIB 8 // d8 посылать "отказ от обслуживания" -upd -#define TERM_COIN 7 // d7 считаем монетки - upd -#define SLEEP 9 // d9 пока не работаем - двигатель спит -#define RELAY 10 // d10 ключ для отключения терминала и двигателя в ночное время -#define BTN_PIN2 11 // кнопка настройки - - -#define STEPS_FRW 19 // шаги вперёд -#define STEPS_BKW 12 // шаги назад - - -// ========================================================= -#include -#include "microDS3231.h" -MicroDS3231 rtc; -#include "EncButton.h" - - -EncButton btn; -EncButton btn2; -EncButton term_inhib; -// EncButton term_coin_put; -int feedAmount = 100; - -// https://robotchip.ru/podklyuchenie-kupyuropriemnika-cashcode-sm-k-arduino/ - -int valuePulse = 10; // Стоимость одного импульса -int minWidthPulse = 80; // Минимальная ширина одного импульса -int maxWidthPulse = 120; // Максимальная ширина одного импульса -int debounce = 4; // Защита от помех -int pulseCount = 0; // Сколько импульсов получено -int receivedRUB = 0; // Сумма -unsigned long pulseDuration; // Как давно был последний импульс -unsigned long pulseBegin = 0; // Начало импульса -unsigned long pulseEnd = 0; // Конец импульса -unsigned long curtime; // Время -int postPulsePause = 300; // Время ожидания, для завершения подсчета импульсов -int pulseState; // Состояние входа "0" или "1" -int lastState = 1; // Последние состояние входа "0" или "1" - - -int paymentsCount = 0; - -int onTime = 6; // время включения -int offTime = 20; // время выключения - - -unsigned long sleepTime; //переменная для задания времени сна - - -// GND -- [ R2 ] -- A0 -- [ R1 ] -- VIN -#define VREF 4.25 // точное напряжение на пине 5V (в данном случае зависит от стабилизатора на плате Arduino) -#define DIV_R1 10025 // точное значение 10 кОм резистора -#define DIV_R2 3285 // точное значение 3.3 кОм резистора - - -void setup() { - rtc.begin(); - if (EEPROM.read(0) != EE_RESET) { // первый запуск - EEPROM.write(0, EE_RESET); - EEPROM.put(1, feedAmount); - rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR); - } - EEPROM.get(1, feedAmount); - pinMode(STEPPIN, OUTPUT); // пин движения - pinMode(DIRPIN, OUTPUT); // пин направления - pinMode(HANDPIN, INPUT); // пин ИК датчик руки - pinMode(BUNKERPIN, INPUT); // пин ИК датчик бункер - pinMode(LED_BUILTIN, OUTPUT); // встроенный LED - pinMode(SLEEP, OUTPUT); // пин для отключения двигателя - pinMode(TERM_COIN, INPUT); // прием сигнала от терминала - pinMode(RELAY, OUTPUT); - - - sleepTime = 60 * 60 * 1000; - //Debug - // Serial.begin(9600); // debug в serial -} - -void loop() { - static uint32_t tmr = 0; - float voltage = (float)analogRead(0) * VREF * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024; - if (millis() - tmr > 500) { // два раза в секунду - static byte prevMin = 0; - tmr = millis(); - DateTime now = rtc.getTime(); - // получаем время - // Serial.print(voltage); // debug - // Serial.println(" V"); // debug - // Serial.print(now.hour); // debug - // Serial.println(" h"); // debug - // Serial.print(rtc.getHours()); - // Serial.print(":"); - // Serial.print(rtc.getMinutes()); - // Serial.print(":"); - // Serial.print(rtc.getSeconds()); - // Serial.print(" "); - // Serial.print(rtc.getDay()); - // Serial.print(" "); - // Serial.print(rtc.getDate()); - // Serial.print("/"); - // Serial.print(rtc.getMonth()); - // Serial.print("/"); - // Serial.println(rtc.getYear()); - if (voltage < 13.2) { - digitalWrite(RELAY, LOW); - delay(sleepTime); - } - if ((now.hour >= onTime && now.hour < offTime && voltage > 13.2)) { //&& voltage > 10.2 - digitalWrite(RELAY, HIGH); // работаем если время рабочее И напряжение выше минимума - } else { - digitalWrite(RELAY, LOW); - } - - } - - // состояние датчика рук - int hand = digitalRead(HANDPIN); //читать инпут с "датчика рук" - digitalWrite(TERM_INHIB, term_inhib.isHold() == 0); - - - btn.tick(); - btn2.tick(); - term_inhib.tick(); - - pulseState = digitalRead(TERM_COIN); // Считываем значение с входа TERM_COIN - curtime = millis(); // Записываем значение миллисекунд с момента начала выполнения программы - - if ((pulseState == 0) && (lastState == 1)) // Ждем начало импульса, логический "0" - { - pulseBegin = curtime; // Записываем значение милисикунд - lastState = 0; // Записываем значение "0" в переменную lastState - } else if ((pulseState == 1) && (lastState == 0)) // Ждем окончания импульса, логический "1" - { - pulseDuration = curtime - pulseBegin; // Расчет длительности импульса в миллисекунд - if (pulseDuration > debounce) // Защита от помех, если импульс был небольшой - { - lastState = 1; // Записываем значение "1" в переменную lastState - } - if ((pulseDuration > minWidthPulse) && (pulseDuration < maxWidthPulse)) // Проверяем ширину импульса - { - pulseEnd = curtime; // Сохранить значение милисикунд, окончания импульса - pulseCount++; // Инкремент счетчика импульсов - } - } - if ((pulseEnd > 0) && (curtime - pulseEnd > postPulsePause)) // Проверяем, поступают ли еще импульсы - { - receivedRUB += pulseCount * valuePulse; // Расчет суммы - // if (hand == LOW) - // { - if (receivedRUB > 0) { - paymentsCount++; // Надо описать логику, "принимаем платежи сколько угодно раз и кормим столько же, как только в кадре появятся руки" - Serial.print("Credit: "); // Вывести текст на последовательный порт //Debug - Serial.print(receivedRUB); // Вывести значение переменной на последовательный порт //Debug - Serial.println(" RUB"); // Вывести текст на последовательный порт //Debug - Serial.print("Payed: "); - Serial.print(paymentsCount); - Serial.println(" times"); - pulseEnd = 0; // Обнуляем - pulseCount = 0; // Обнуляем - receivedRUB = 0; // Обнуляем - } - // } - } - - if (paymentsCount > 0) // Debug подставляем руки, жмем кнопку - получаем внеочередную кормежку - { - feed(); - paymentsCount--; - Serial.print("Payed: "); - Serial.print(paymentsCount); - Serial.println(" times"); - } - - // if (hand == LOW) // Debug подставляем руки, жмем кнопку - получаем внеочередную кормежку - // { - // feedByButton(); - // } - - if (btn.click()) { - feed(); - } - - if (btn2.hold()) // Задаем размер порции: - { - int newAmount = 0; - while (btn2.isHold()) // пока кнопка зажата - { - btn2.tick(); - oneRev(); // крутим мотор - newAmount++; // считаем шаги - } - feedAmount = newAmount; - EEPROM.put(1, feedAmount); // записываем количество шагов в постоянную память - } - - -} // конец основного цикла - -// выдача корма -void feed() { - for (int i = 0; i < feedAmount; i++) oneRev(); - disableMotor(); -} - - -// кормежка по кнопке -void feedByButton() { - if (btn.click()) { - feed(); - } -} - -// выключаем ток на мотор -void disableMotor() { - digitalWrite(SLEEP, LOW); -} - -// вращение -void runMotor() { - digitalWrite(SLEEP, HIGH); //Включаем мотор - digitalWrite(STEPPIN, HIGH); // по часовой - delayMicroseconds(FEED_SPEED); - digitalWrite(STEPPIN, LOW); // против часовой - delayMicroseconds(FEED_SPEED); -} - -// вращение двигателя в виброрежиме, для недопущения заклинивания -void oneRev() { - for (int i = 0; i < STEPS_BKW; i++) { - digitalWrite(DIRPIN, LOW); - runMotor(); - } - for (int i = 0; i < STEPS_FRW; i++) { - digitalWrite(DIRPIN, HIGH); - runMotor(); - } -} diff --git a/microDS3231.h b/microDS3231.h index c006020..b93f79c 100644 --- a/microDS3231.h +++ b/microDS3231.h @@ -1,247 +1,82 @@ /* - Скетч к проекту "Спутниковая Роботорговля" -bgp, 2023 + Лёгкая библиотека для работы с RTC DS3231 для Arduino + Документация: + GitHub: https://github.com/GyverLibs/microDS3231 + Возможности: + - Чтение и запись времени + - Вывод в char* и String + - Чтение температуры датчика + + Egor 'Nich1con' Zakharov & AlexGyver, alex@alexgyver.ru + https://alexgyver.ru/ + MIT License + + Версии: + v1.2 - добавлены ограничения на вводимые в setTime числа. Также нельзя ввести 29 февраля увы =) + v1.3 - пофикшено зависание, когда модуль отключен но опрашивается + v1.4 - незначительный фикс + v2.0 - новые возможности, оптимизация и облегчение + v2.1 - добавил вывод температуры, вывод в String и char + v2.2 - исправлены дни недели (пн-вс 1-7) + v2.3 - небольшие исправления, оптимизация, изменён порядок вывода даты + v2.4 - исправлена установка времени компиляции + v2.5 - добавлен begin для проверки наличия модуля на линии + v2.6 - исправлены отрицательные температуры */ -#define EE_RESET 26 // любое число 0-255. Измени, чтобы сбросить настройки и обновить время -#define FEED_SPEED 2500 // задержка между шагами мотора (мкс) -#define DIRPIN 2 // d2 направление -#define STEPPIN 3 // d3 движение -#define BTN_PIN 4 // кнопка выдачи -#define BUNKERPIN 5 // d5 датчик наличия корма -#define HANDPIN 6 // d6 датчик наличия руки -#define TERM_INHIB 8 // d8 посылать "отказ от обслуживания" -upd -#define TERM_COIN 7 // d7 считаем монетки - upd -#define SLEEP 9 // d9 пока не работаем - двигатель спит -#define RELAY 10 // d10 ключ для отключения терминала и двигателя в ночное время -#define BTN_PIN2 11 // кнопка настройки -// 773 - шаги на один полный круг -// 3 - количество выемок в одном круге -// 258 = 773/3 -#define STEPS_FRW 258 // шаги вперёд -#define STEPS_BKW 0 // шаги назад +#ifndef microDS3231_h +#define microDS3231_h +//#include // выбор между библиотеками Wire и microWire +#include +#include "buildTime.h" -// ========================================================= -#include -#include "microDS3231.h" -MicroDS3231 rtc; -#include "EncButton.h" +#include +#define COMPILE_TIME F(__TIMESTAMP__) -EncButton btn; -EncButton btn_setup; -EncButton term_inhib; -// EncButton term_coin_put; -int feedAmount = 1; +struct DateTime { + uint8_t second; + uint8_t minute; + uint8_t hour; + uint8_t day; + uint8_t date; + uint8_t month; + uint16_t year; +}; -// https://robotchip.ru/podklyuchenie-kupyuropriemnika-cashcode-sm-k-arduino/ +class MicroDS3231 { +public: + MicroDS3231(uint8_t addr = 0x68); // конструктор. Можно передать адрес + bool begin(void); // инициализация, вернет true, если RTC найден + void setTime(const __FlashStringHelper* stamp); // установка времени == времени компиляции + void setTime(DateTime time); // установить из структуры DateTime + void setTime(int8_t seconds, int8_t minutes, int8_t hours, int8_t date, int8_t month, int16_t year); // установка времени + void setHMSDMY(int8_t hours, int8_t minutes, int8_t seconds, int8_t date, int8_t month, int16_t year); // установка времени тип 2 + + DateTime getTime(void); // получить в структуру DateTime + uint8_t getSeconds(void); // получить секунды + uint8_t getMinutes(void); // получить минуты + uint8_t getHours(void); // получить часы + uint8_t getDay(void); // получить день недели + uint8_t getDate(void); // получить число + uint16_t getYear(void); // получить год + uint8_t getMonth(void); // получить месяц + + String getTimeString(); // получить время как строку вида HH:MM:SS + String getDateString(); // получить дату как строку вида DD.MM.YYYY + void getTimeChar(char* array); // получить время как char array [8] вида HH:MM:SS + void getDateChar(char* array); // получить дату как char array [10] вида DD.MM.YYYY + + bool lostPower(void); // проверка на сброс питания + float getTemperatureFloat(void);// получить температуру float + int getTemperature(void); // получить температуру int + +private: + uint8_t encodeRegister(int8_t data); + int getTemperatureRaw(void); + uint8_t readRegister(uint8_t addr); + uint8_t unpackRegister(uint8_t data); + uint8_t unpackHours(uint8_t data); + const uint8_t _addr; +}; -int valuePulse = 10; // Стоимость одного импульса -int minWidthPulse = 80; // Минимальная ширина одного импульса -int maxWidthPulse = 120; // Максимальная ширина одного импульса -int debounce = 4; // Защита от помех -int pulseCount = 0; // Сколько импульсов получено -int receivedRUB = 0; // Сумма -unsigned long pulseDuration; // Как давно был последний импульс -unsigned long pulseBegin = 0; // Начало импульса -unsigned long pulseEnd = 0; // Конец импульса -unsigned long curtime; // Время -int postPulsePause = 300; // Время ожидания, для завершения подсчета импульсов -int pulseState; // Состояние входа "0" или "1" -int lastState = 1; // Последние состояние входа "0" или "1" - -int paymentsCount = 0; - -int onTime = 6; // время включения -int offTime = 20; // время выключения - -unsigned long sleepTime; // переменная для задания времени сна - -int monitor_speed = 9600; - -// GND -- [ R2 ] -- A0 -- [ R1 ] -- VIN -#define VREF 4.5 // точное напряжение на пине 5V (в данном случае зависит от стабилизатора на плате Arduino) -#define DIV_R1 6800 // точное значение 6.80 кОм резистора -#define DIV_R2 1100 // точное значение 1.1 кОм резистора - -#define DEBUG true - -void setup() -{ - rtc.begin(); - if (EEPROM.read(0) != EE_RESET) - { // первый запуск - EEPROM.write(0, EE_RESET); - EEPROM.put(1, feedAmount); - rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR); - } - EEPROM.get(1, feedAmount); - pinMode(STEPPIN, OUTPUT); // пин движения - pinMode(DIRPIN, OUTPUT); // пин направления - pinMode(HANDPIN, INPUT); // пин ИК датчик руки - pinMode(BUNKERPIN, INPUT); // пин ИК датчик бункер - pinMode(LED_BUILTIN, OUTPUT); // встроенный LED - pinMode(SLEEP, OUTPUT); // пин для отключения двигателя - pinMode(TERM_COIN, INPUT); // прием сигнала от терминала - pinMode(RELAY, OUTPUT); - - sleepTime = 60 * 60 * 1000; - // Debug - if (DEBUG) - { - Serial.begin(monitor_speed); // debug в serial - sleepTime = 10 * 1000; - } -} - -void loop() -{ - static uint32_t tmr = 0; - float voltage = (float)analogRead(0) * VREF * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024; - if (millis() - tmr > 500) - { // два раза в секунду - static byte prevMin = 0; - tmr = millis(); - DateTime now = rtc.getTime(); - if (DEBUG) - { - // получаем время - Serial.println(String(voltage) + " V"); // debug - Serial.println(String(now.hour) + " h"); // debug - String str_time = String(rtc.getHours()) + ":" + String(rtc.getMinutes()) + ":" + String(rtc.getSeconds()); - String date_time = String(rtc.getDate()) + "-" + String(rtc.getMonth()) + "-" + String(rtc.getYear()); - Serial.println(str_time + " " + date_time); - } - if (voltage < 31) - { - digitalWrite(RELAY, LOW); - delay(sleepTime); - } - if ((now.hour >= onTime && now.hour < offTime && voltage > 31)) - { //&& voltage > 10.2 - digitalWrite(RELAY, HIGH); // работаем если время рабочее И напряжение выше минимума - } - else - { - digitalWrite(RELAY, LOW); - } - } - - digitalWrite(TERM_INHIB, term_inhib.isHold() == 0); - - btn.tick(); - btn_setup.tick(); - term_inhib.tick(); - - pulseState = digitalRead(TERM_COIN); // Считываем значение с входа TERM_COIN - curtime = millis(); // Записываем значение миллисекунд с момента начала выполнения программы - - if ((pulseState == 0) && (lastState == 1)) // Ждем начало импульса, логический "0" - { - pulseBegin = curtime; // Записываем значение милисикунд - lastState = 0; // Записываем значение "0" в переменную lastState - } - else if ((pulseState == 1) && (lastState == 0)) // Ждем окончания импульса, логический "1" - { - pulseDuration = curtime - pulseBegin; // Расчет длительности импульса в миллисекунд - if (pulseDuration > debounce) // Защита от помех, если импульс был небольшой - { - lastState = 1; // Записываем значение "1" в переменную lastState - } - if ((pulseDuration > minWidthPulse) && (pulseDuration < maxWidthPulse)) // Проверяем ширину импульса - { - pulseEnd = curtime; // Сохранить значение милисикунд, окончания импульса - pulseCount++; // Инкремент счетчика импульсов - } - } - if ((pulseEnd > 0) && (curtime - pulseEnd > postPulsePause)) // Проверяем, поступают ли еще импульсы - { - receivedRUB += pulseCount * valuePulse; // Расчет суммы - if (receivedRUB > 0) - { - paymentsCount++; // Надо описать логику, "принимаем платежи сколько угодно раз и кормим сстолько же, как только в кадре появятся руки" - Serial.print("Credit: "); // Вывести текст на последовательный порт //Debug - Serial.print(receivedRUB); // Вывести значение переменной на пслеовательный порт //Debug - Serial.println(" RUB"); // Вывести текст на последовательный порт //Debug - Serial.print("Payed: "); - Serial.print(paymentsCount); - Serial.println(" times"); - pulseEnd = 0; // Обнуляем - pulseCount = 0; // Обнуляем - receivedRUB = 0; // Обнуляем - } - } - - if (paymentsCount > 0) // Debug подставляем руки, жмем кнопку - получаем внеочередную кормежку - { - feed(); - paymentsCount--; - Serial.print("Payed: "); - Serial.print(paymentsCount); - Serial.println(" times"); - } - - if (btn.click()) - { - feed(); - } - - if (btn_setup.hold()) - { - feedAmount = 1; - EEPROM.put(1, feedAmount); - } - if (btn_setup.click()) // Задаем размер порции: - { - feedAmount += 1; - EEPROM.put(1, feedAmount); // записываем количество шагов в постоянную память - } - -} // конец основного цикла - -// выдача корма -void feed() -{ - for (int i = 0; i < feedAmount; i++) - oneRev(); - disableMotor(); -} - -// кормежка по кнопке -void feedByButton() -{ - if (btn.click()) - { - feed(); - } -} - -// выключаем ток на мотор -void disableMotor() -{ - digitalWrite(SLEEP, LOW); -} - -// вращение -void runMotor() -{ - digitalWrite(SLEEP, HIGH); // Включаем мотор - digitalWrite(STEPPIN, HIGH); // по часовой - delayMicroseconds(FEED_SPEED); - digitalWrite(STEPPIN, LOW); // против часовой - delayMicroseconds(FEED_SPEED); -} - -// вращение двигателя в виброрежиме, для непопущения заклинивания -void oneRev() -{ - for (int i = 0; i < STEPS_BKW; i++) - { - digitalWrite(DIRPIN, HIGH); // low обратное вращение - runMotor(); - } - for (int i = 0; i < STEPS_FRW; i++) - { - digitalWrite(DIRPIN, LOW); - runMotor(); - } -} +#endif \ No newline at end of file