„Arduino Cookbook“ ištrauka: didelės duomenų lentelės programos atmintyje - 💡 Fix My Ideas

„Arduino Cookbook“ ištrauka: didelės duomenų lentelės programos atmintyje

„Arduino Cookbook“ ištrauka: didelės duomenų lentelės programos atmintyje


Autorius: Ethan Holmes, 2019

Jei kada nors sukūrėte „Arduino“ projektą, apimantį daug teksto eilutes, greitai galėsite rasti standartinę „Arduino“ 2K SRAM SRAM. Vienas iš sprendimų yra išsaugoti tekstą programos atmintyje, o 32Kb yra daug daugiau.

2011 m. Pavasarį dirbau projekte su menininkais Steve Hanson ir Elliot Clapp, kuris buvo „Apexart“ grupės šou „Let it end like this“, kurį kuravo Todd Zuniga. Steve sukūrė generacinį klausimyną, kuris apklausė galerijas ir pristatė juos su paskutiniais žodžiais. „Elliot“ pastatė interaktyviąją mygtuko konsolę ir LCD ekraną, o mes pastatėme daiktą naudodami nebrangų „Arduino“ variantą „Modern Device“. Visas projektas yra dokumentuotas „Make: Projects wiki“.

Steve poetiniai „Last Words“ užėmė beveik 16K atminties, kuri buvo saugoma „Arduino“ programos atmintyje. Žemiau pateikiamas Michael Margolio „Arduino Cookbook“ ištraukas, kuriame paaiškinama, kaip išsaugoti ir pasiekti didelę duomenų lentelės duomenų atmintyje lentelę.

17.3 Skaitmeninių reikšmių saugojimas ir atkūrimas programos atmintyje

Problema

Turite daug pastovių skaitmeninių duomenų ir nenorite, kad tai būtų skirta RAM.

Sprendimas

Skaitmeninius kintamuosius saugokite programos atmintyje („Flash“ atmintis, naudojama „Arduino“ programų saugojimui).

Šis brėžinys reguliuoja nykstančią šviesos diodą dėl netiesinio žmogaus regėjimo jautrumo. Ji išsaugo vertes, kurios bus naudojamos 256 reikšmių lentelėje, o ne atmintyje.

Eskizas paremtas receptu 7.2; Žr. 7 skyrių dėl elektros instaliacijos schemos ir diskusijų apie LED šviesos diodus. Vykdant šį eskizą, 5 skiltyje esantis šviesos diodas keičia sklandų ryškumą, palyginti su LED 3 spalva:

/ * „ProgmemCurve“ eskizas * naudoja lentelę „Progmem“, kad konvertuotų linijinį į eksponentinį išėjimą * Žr. Receptą 7.2 ir 7-2 * / #include // reikalingas PROGMEM // lentelės eksponentinių reikšmių // generavimui i reikšmėms nuo 0 iki 255 -> x = apvalios (pow (2.0, i / 32.0) - 1); konst. baito lentelė [] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 69, 70, 72, 73, 75, 77, 78, 80, 82, 84, 86, 88, 90, 91, 94, 96, 98, 100, 102, 104, 107, 109, 111, 114, 116, 119, 122, 124, 127, 130, 133, 136, 139, 142, 145, 148, 151, 155, 158, 161, 165, 169, 172, 176, 180, 184, 188, 192, 196, 201, 205, 210, 214, 219, 224, 229, 234, 239, 244, 250}; const int rawLedPin = 3; // šis šviesos diodas tiekiamas žaliavinėmis vertėmis const int adjustLedPin = 5; // šis LED šviečia nuo lentelės int ryškumo = 0; int prieaugis = 1; void setup () {// kaiščiai, kuriuos valdo analogWrite, neturi būti deklaruojami kaip išėjimai} void loop () {if (ryškumas> 254) {prieaugis = -1; // suskaičiuoti, kai pasiekiama 255} kita, jei (šviesumas <1) {prieaugis = 1; // suskaičiuoti po sumažinimo iki 0} ryškumo = ryškumo + prieaugio; // prieaugis (arba sumažėjimo ženklas yra minusas) // įrašykite šviesumo reikšmę į analoginesWrite (rawLedPin, ryškumas) šviesos diodus; // tai yra neapdorota reikšmė int AdjustBrightness = pgm_read_byte (& lentelė [ryškumas]); // pakoreguota vertė analoginė (koreguotaLedPin, pakoreguotaBlightness); vėlavimas (10); // 10ms kiekvienam žingsnio keitimui reiškia 2,55 sek.

Diskusija

Kai reikia naudoti sudėtingą išraišką, kad apskaičiuotumėte vertybių, kurios reguliariai kartojamos, diapazoną, dažnai geriau yra iš anksto apskaičiuoti vertes ir įtraukti jas į kodų reikšmių lentelę (paprastai kaip masyvą). Tai išsaugo laiką, reikalingą skaičiuoti vertes pakartotinai, kai kodas veikia. Trūkumas susijęs su atmintimi, kurios reikia šioms vertėms įterpti į RAM. „RAM“ yra ribota „Arduino“, o daug didesnė programos atminties erdvė gali būti naudojama nuolatinėms reikšmėms saugoti. Tai ypač naudinga eskizams, kuriuose yra didelių skaičių matricų.

Brėžinio viršuje lentelė apibrėžiama taip:

konst. baitų lentelė [] PROGMEM = {0,. . .

PROGMEM pasakoja kompiliatoriui, kad vertės turi būti saugomos programos atmintyje, o ne RAM. Likusi išraiška yra panaši į įprastinės masyvo apibrėžimą (žr. 2 skyrių).

Žemo lygio apibrėžimai, reikalingi norint naudoti PROGMEM, yra faile, pavadintame pgmspace.h, o eskizas apima tai:

#include

Norėdami sureguliuoti ryškumą, kad išnyks atrodytų vienodai, šis receptas prideda šias eilutes prie LED išėjimo kodo, naudojamo 7.2 receptūroje:

int AdjustBrightness = pgm_read_byte (& lentelė [ryškumas]); analoginis raštas (koreguotasLedPin, pakoreguotasBlightness);

Kintamasis reguliuojamasBlightness nustatomas iš vertės, skaitomos iš programos atminties. Išraiška pgm_read_byte (& lentelė [ryškumas]); reiškia grąžinti lentelės masyvo įrašo adresą pagal šviesumo nustatytą indekso padėtį. Kiekvienas lentelės įrašas yra vienas baitas, todėl kitas būdas rašyti šią frazę yra:

pgm_read_byte (lentelė + ryškumas);

Jei neaišku, kodėl ir lentelė [ryškumas] atitinka lentelės + ryškumą, nesijaudinkite; naudoti bet kurią išraišką, kuri jums yra prasmingesnė.

Kitas pavyzdys yra iš receptų 6.5, kuriame naudojama lentelė, skirta infraraudonųjų spindulių jutiklio skaitymui konvertuoti į atstumą. Čia pateikiamas šio recepto eskizas, konvertuojamas, kad būtų galima naudoti lentelę programos atmintyje vietoj RAM:

/ * ir-distance_Progmem eskizas * atspaudų atstumas ir pakeitimai LED blykstės greitis * priklausomai nuo atstumo nuo IR jutiklio * naudoja progmem lentelės * / # // reikia, kai naudojama Progmem // lentelės įrašai yra atstumai 250 milivolttų laipsnių intervalu TABLE_ENTRIES = 12; const int firstElement = 250; // pirmasis įrašas yra 250 mV const int intervalas = 250; // milivoltai tarp kiekvieno elemento // yra lentelės apibrėžimas programos atmintyje const dist DistanceP [TABLE_ENTRIES] PROGMEM = {150,140,130,100,60,50, 40,35,30,25,20,15}; // Ši funkcija nuskaito iš programos atminties nurodyto indekso int getTableEntry (int indeksas) {int value = pgm_read_word (& distanceP [index]); grąžinimo vertė; }

Likęs kodas panašus į receptą 6.5, išskyrus tai, kad funkcija getTableEntry naudojama norint gauti vertę iš programos atminties, o ne prieiti prie lentelės RAM. Čia yra peržiūrėtas getDistance funkcija iš šio recepto:

int getDistance (int mV) {jei (mV> intervalas * TABLE_ENTRIES) grąžina getTableEntry (TABLE_ENTRIES-1); // minimalus atstumas kitur {int index = mV / intervalas; float frac = (mV% 250) / (plūdės) intervalas; grįžti getTableEntry (indeksas) - ((getTableEntry (indeksas) - getTableEntry (indeksas + 1)) * frac); }}


„Maker Shed“:

„Arduino Cookbook“ Sukurkite savo robotus, žaislus, nuotolinius valdiklius, aliarmus, detektorius ir dar daugiau su „Arduino“ ir šiuo vadovu. „Arduino“ leidžia menininkams ir dizaineriams kurti įvairius nuostabius objektus ir prototipus, kurie sąveikauja su fiziniu pasauliu. Naudodami šią „Cookbook“ galite pasinerti į dešinę ir eksperimentuoti, nes tai yra daugiau nei šimtas patarimų ir metodų, nesvarbu, koks jūsų įgūdžių lygis. Čia rasite pavyzdžių ir patarimų, kuriuos reikia pradėti, išplėsti ir pagerinti savo projektus.



Jums Gali Būti Įdomu

Produktyvūs plastikiniai žaislai

Produktyvūs plastikiniai žaislai


Aš, mano skara ir aš konkursas: Faux-y Lady šalikas

Aš, mano skara ir aš konkursas: Faux-y Lady šalikas


Mokytojų naminių gyvūnų projektai

Mokytojų naminių gyvūnų projektai


Grįžimas į veržles ir varžtus

Grįžimas į veržles ir varžtus






Naujausios Žinutės