Jeffrey Cross
Jeffrey Cross

Arduino Helper功能

这是Arduino的一些有用的功能。

闪烁LED

此功能按照要求的闪烁速率按要求多次闪烁LED灯。

void blinkLED(byte targetPin,int numBlinks,int blinkRate){for(int i = 0; i <numBlinks; i ++){digitalWrite(targetPin,HIGH);延迟(blinkRate); digitalWrite(targetPin,LOW);延迟(blinkRate); }}

闪烁一个数字

回到计算机的黎明时代,有时候事情出错了,向用户传达错误的唯一方法就是眨眼。在处理微控制器时,这有时会派上用场。以下功能使序列闪烁以在视觉上指示数字。

void blinkNumber(char * numString){int versLength = strlen(numString);延迟(200); for(int i = 0; i <versLength; i ++){int number = numString [i] -48; if(number == 0){blinkLED(LED_A,1,20);延迟(160); } if(number> 0 && number <10)blinkLED(LED_A,number,200);延迟(400); }}

嗡嗡声蜂鸣器

一种广义的通用功能,可以使用压电式蜂鸣器,而无需在每次想要听到特定声音频率时仔细考虑数学运算。您需要做的就是告诉功能您要使用哪个引脚,您想要听到的频率以及播放该频率的持续时间。

void buzz(int targetPin,long frequency,long length){long delayValue = 1000000 / frequency / 2; long numCycles =频率*长度/ 1000; for(long i = 0; i <numCycles; i ++){digitalWrite(targetPin,HIGH); delayMicroseconds(delayValue); digitalWrite(targetPin,LOW); delayMicroseconds(delayValue); }}

检查空闲RAM

ATmega328具有32K的程序存储器,但只有2K的SRAM。程序存储器用于代码,RAM用于动态变量。实际上它实际上不到2K的RAM,因为Arduino库会为自己占用一些动态内存空间。

Arduino环境很乐意让你编译一个超出微控制器SRAM限制的程序,但程序行为将变得完全不可预测,代码会做奇怪的事情和/或崩溃。此函数将返回SRAM中当前可用的字节数。

int memoryTest(){int byteCounter = 0; byte * byteArray; while((byteArray =(byte *)malloc(byteCounter * sizeof(byte)))!= NULL){byteCounter ++;自由(字节阵列); } free(byteArray); return byteCounter; }

映射更大的数字

这是一个版本 地图 能够处理更大正数的函数,尽管它没有带负数。

long mapBig(unsigned long x,unsigned long in_min,unsigned long in_max,unsigned long out_min,unsigned long out_max){return(x - in_min)*(out_max - out_min)/(in_max - in_min)+ out_min; }

连接到WiFi

新的Arduino WiFi屏蔽板非常漂亮。但是,处理不同类型的网络可能很麻烦。以下代码段将尝试连接到其SSID存储在其中的WPA / WPA2加密WiFi网络 SSID 变量和密码存储在 通过 变量。但是,如果它找不到该网络,它将退回并扫描开放的WiFi网络。

if(WiFi.status()== WL_NO_SHIELD){Serial.println(“WiFi shield not present”);而(真); } if(stringFromCharString(ssid)!=“”){while(status!= WL_CONNECTED){timesWeTriedToConnect ++; Serial.print(F(“尝试连接到SSID(尝试”)); Serial.print(timesWeTriedToConnect); Serial.print(F(“of of 5):”)); Serial.println(SSID); status = WiFi.begin(ssid,pass); //连接到WPA / WPA2网络。延迟(2000);如果(timesWeTriedToConnect> = 5)中断; if(status!= WL_CONNECTED){Serial.print(“无法连接到ssid'”); Serial.print(ssid); Serial.println(“'”); Serial.println(“**扫描开放网络**”); byte numSsid = WiFi.scanNetworks(); Serial.print(“可用网络数量:”); Serial.println(numSsid); for(int thisNet = 0; thisNet

读取和写入EEPROM

有时将数字或其他数据存储到Arduino的EEPROM中可以保护它免受电源循环的影响。使用附带的EEPROM库,实际上很容易将数字写入EEPROM,

void setNumber(unsigned long ctr){Serial.print(“将EEPROM中的设置号设置为=”); Serial.println(ctr); EEPROM.write(4,(ctr&0xFFFFFFFF)>> 24); //写MSB EEPROM.write(3,(ctr&0xFFFFFF)>> 16); //写第3个EEPROM.write(2,(ctr&0xFFFF)>> 8); //写下2ndB EEPROM.write(1,ctr&0xFF); //写LSB}

然后读回数字,

unsigned long getNumber(){unsigned long ctr; //数字的初始设置if(EEPROM.read(5)!= 1){//如果数字设置状态为false Serial.println(“在EEPROM中初始化数字”); EEPROM.write(1,0); //写LSB零EEPROM.write(2,0); //写2ndB零EEPROM.write(3,0); //写3rdB零EEPROM.write(4,0); //写MSB零EEPROM.write(5,1); //计数器设置状态为真} //获取数字 - 为32位数字添加字节数ctr =(EEPROM.read(4)<< 24)+(EEPROM.read(3)<< 16)+(EEPROM。 read(2)<< 8)+(EEPROM.read(1)); Serial.print(“从EEPROM中获取数字=”); Serial.println(ctr);返回中心; }

这篇文章的代码由Rob Faludi和Alasdair Allan提供。经许可后,它会在MAKE网站上重新发布。

分享

发表评论