Arduino такталарында эс тутумдун бир нече түрлөрү бар. Биринчиден, бул статикалык оперативдүү эстутум (оперативдүү эс тутум), ал программанын аткарылышында өзгөрүлмө нерселерди сактоо үчүн колдонулат. Экинчиден, бул сиз жазган эскиздерди сактаган флеш-эстутум. Үчүнчүдөн, бул маалыматты туруктуу сактоо үчүн колдонула турган EEPROM. Эстутумдун биринчи түрү туруксуз, ал Arduino кайра жүктөлгөндөн кийин бардык маалыматты жоготот. Эстеликтин экинчи эки түрү, маалымат өчүрүлгөндөн кийин дагы, жаңысы менен жазылганга чейин сактайт. Эс тутумдун акыркы түрү - EEPROM - маалыматтарды жазууга, сактоого жана зарылдыгына жараша окууга мүмкүнчүлүк берет. Биз азыр бул эс тутумду карап чыгабыз.
Зарыл
- - Arduino;
- - компьютер.
Нускамалар
1 кадам
EEPROM электрдик өчүрүлүүчү программалоочу окууга гана арналган эстутум, б.а. электрдик өчүрүлө турган окууга гана жараган эс тутум. Бул эс тутумдагы маалымат электр кубаты өчүрүлгөндөн кийин ондогон жылдар бою сакталат. Кайра жазуу циклдарынын саны бир нече миллион ирет орун алган.
Arduinoдогу EEPROM эс тутумунун көлөмү чектелүү: ATmega328 микроконтроллерине негизделген тактайлар үчүн (мисалы, Arduino UNO жана Nano), эс тутумдун көлөмү 1 KB, ATmega168 жана ATmega8 такталары үчүн - 512 байт, ATmega2560 жана ATmega1280 үчүн - 4 КБ.
2-кадам
Arduino үчүн EEPROM менен иштөө үчүн, атайын китепкана жазылган, ал Arduino IDE'ге демейки шартта киргизилген. Китепкана төмөнкү өзгөчөлүктөрдү камтыйт.
окуу (дарек) - EEPROMдон 1 байт окулат; дарек - маалыматтар окула турган дарек (0ден башталган уяча);
жазуу (дарек, маани) - дарек дареги боюнча эс тутумга маанинин маанисин (1 байт, саны 0дон 255ке чейин) жазат;
жаңыртуу (дарек, маани) - эгерде анын эски мазмуну жаңысынан айырмаланса, даректеги маанини алмаштырат;
алуу (дарек, маалыматтар) - көрсөтүлгөн типтеги маалыматтарды эс тутумдан дарек боюнча окуйт;
put (дарек, маалыматтар) - көрсөтүлгөн типтеги маалыматтарды дарек боюнча эс тутумга жазат;
EEPROM [дарек] - маалыматтарды эс тутумга жазуу жана окуу үчүн "EEPROM" идентификаторун массив катарында колдонууга мүмкүнчүлүк берет.
Эскиздеги китепкананы колдонуу үчүн, биз #include EEPROM.h директивасына кошобуз.
3-кадам
EEPROMго эки бүтүн сандарды жазып, андан кийин EEPROMдон окуп, сериялык портко чыгаралы.
0ден 255ке чейинки сандарда көйгөйлөр жок, алар 1 байт гана эс тутумду ээлейт жана EEPROM.write () функциясы аркылуу керектүү жерге жазылат.
Эгерде бул сан 255тен чоң болсо, анда highByte () жана lowByte () операторлорун колдонуп, аны байттарга бөлүп, ар бир байт өз уячасына жазуу керек. Бул учурда максималдуу саны 65536 (же 2 ^ 16).
Мына, 0-уячадагы сериялык порт монитор жөн эле 255тен аз санды көрсөтөт. 1 жана 2-уячаларда 789 деген чоң сан сакталат, бул учурда 1-уяча ашып кетүү факторун 3, ал эми 2-уячада жетишпеген 21 санын сактайт. (б.а. 789 = 3 * 256 + 21). Байттарга талданган көп санды чогултуу үчүн () функциясы бар: int val = word (салам, төмөн), бул жерде салам жана төмөн - жогорку жана төмөнкү байттардын мааниси.
Биз эч качан жазып көрбөгөн башка клеткалардын баарында 255 сандары сакталат.
4-кадам
Өзгөрмө сандарды жана саптарды жазуу үчүн EEPROM.put () ыкмасын, ал эми окуу үчүн EEPROM.get () колдонуңуз.
Setup () процедурасында адегенде калкып чыккан чекит f санын жазабыз. Андан кийин флоат түрү ээлеген эс тутумдарынын саны боюнча жылып, сыйымдуулугу 20 уяча болгон char сабын жазабыз.
Loop () процедурасында биз эс тутумдарынын бардыгын окуп, аларды алгач "float", андан кийин "char" түрү деп чечмелеп, натыйжаны сериялык портко чыгарабыз.
0дөн 3кө чейинки уячалардагы маанис калкыма чекиттин номери, ал эми 4-орундан баштап сап катары туура аныкталгандыгын көрө аласыз.
Натыйжада ovf (толуп кетүү) жана nan (сан эмес) мааниси, ал санды жылма чекиттин номерине туура которууга болбой тургандыгын көрсөтөт. Эгерде сиз эс тутуму кайсы типтеги маалыматтарды ээлей тургандыгын так билсеңиз, анда сизде эч кандай кыйынчылык болбойт.
5-кадам
Өтө ыңгайлуу өзгөчөлүк - эстутум клеткаларын EEPROM массивинин элементтери деп атоо. Бул эскизде setup () процедурасында биз биринчи 4 байтка маалыматтарды жазып, ал эми loop () процедурасында ар бир мүнөт сайын бардык уячалардан маалыматтарды окуп, аларды сериялык портко чыгарабыз.