arduino实例程序难点汇总
basics
analogreadserial
bareminimum
blink
DigitalReadSerial主要使用设置引脚的状态为输出或者输入,将引脚置高或低,延时函数的应用,串口begin和串口打印,println和print的区别在于,前者有换行,局部变量和全局变量的定义,以及变量的类型,analogwrite表示pwm输出0-255,pinmode有三个选项分别为,input,output,input_pull,第三个为开启内部上拉电阻。之后不需要再接下拉电阻和电源,接个开关和地即可
fade实例中fadeAmount = -fadeAmount,实现由5和-5之间的转换,使得brightness为0时每次加5,直到255,到255,fdeAmount变为-5,开始减小。if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}由该语句实现。
ReadAnalogVoltage,
该demo中出现float类型的变量,死循环函数可以直接用while(1);,或者while(1){},float类型在arduino语言中,只要有一个变量为小数,即可如,5.2/1023.0或者5.2/1023,或者5./1023等等都可以,经测试输出结果保留小数点后两位。
digital
blinkwithoutdelay
该实例表示的是不用delay函数,实现led的一亮一灭,主要通过millis函数实现,将所有涉及状态转换的程序放在if (currentMillis - previousMillis >= interval) {
}里,直到间隔差大于间隔时间,才去改变led的状态。该程序出现const,应该表示该变量不可更新。int state=low也是对的,unsigned long previousMillis = 0;上个状态定义为全局变量,无符号长型,const long interval = 1000;间隔也为全局变量,长型不变量,unsigned long currentMillis = millis();当前时间定义为局部变量,也是无符号长型,previousMillis和currentMillis都会被刷新,所以不能用const。改程序不会延时某些程序段,比delay函数好用。
button
该程序,通过判断某个输入引脚的状态,来控制led的亮灭。
debounce
该程序主要实现每按一下亮,再按一下灭,加入防抖算法,该方法只有在有上升沿到来时才会动作,if (reading != buttonState) {buttonState = reading;
// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH) {
ledState = !ledState;
}该条件判断只有这次和上次不同时,才执行,只有这次为高电平时才改变状态。它们都在if ((millis() - lastDebounceTime) > debounceDelay) {}改程序内部,防抖,if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}该判断不可去掉,去掉之后效果就不好了。
digitalinputpullup
pinMode(2, INPUT_PULLUP);数字引脚上拉,不用再接上拉下拉电阻和电源,
Statechangedetection状态变换检测,if (buttonState != lastButtonState) {},lastButtonState = buttonState;这次与上次比较。取余符号为%。
tonekeyboard
tone(pin, frequency, duration),tone(pin, frequency),间隔单位us,unsigned long型,可以选择的,数组的定义 int notes[]={440,494,131};
tonemelody
数组定义int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
int(162.5)=162。noTone(pin)关闭发声。
tonemultiple
tonepitchfollower
int thisPitch = map(sensorReading, 400, 1000, 120, 1500);将范围映射
analog
analoginoutserial
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);最后一个换行,\t为一个table间隔。
analoginput
analogwritemega
mega提供14路8位pwm输出。引脚0-13,for (int thisPin = lowestPin; thisPin <= highestPin; thisPin++) {
pinMode(thisPin, OUTPUT);
},连续定义为输出。for (int thisPin = lowestPin; thisPin <= highestPin; thisPin++) {
// fade the LED on thisPin from off to brightest:
for (int brightness = 0; brightness < 255; brightness++) {
analogWrite(thisPin, brightness);
delay(2);
}
},for循环先内部再外部。
calibration校准模拟传感器的最大最小值,
millis()无参数,返回值为从板子运行的时间,无符号长型,单位ms,大约50天溢出,变为0。constrain(sensorValue, 0, 255);返回为中间的值。限制其输出为0-255之间,
fading
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
},fadevalue+=5表示,每次加5赋值给fadevalue。delay(time)单位为us,
smoothing
,主要用平均值的方法。
定义数组,const int numReadings = 10;int readings[numReadings];数组赋值,for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;}
readings[readIndex] = analogRead(inputPin);数组赋值;total = total + readings[readIndex];
// advance to the next position in the array:
readIndex = readIndex + 1;数组每次加1。
communciation
ASCIItable
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}。没有串口连接就不往下执行,进入死循环。主要用在setup()函数中。
Serial.print(value,format),format有BIN,OCT,HEX,默认十进制DEC,Serial.write意思Writes binary data to the serial port.Serial.write(33);就表示一个!符号。
while (true) {
continue;
}
}和while(1);相同
for ( int x = 0; x < 255; x ++)
{
if (x > 40 && x < 120){ // create jump in values
continue;
}
Serial.println(x);
delay(50);
},continue函数是在这里面循环,不出来,即跳过大于40小于120。
Dimmer
byte brightness;在值为0-255的变量可以用byte定义,if (Serial.available()) {
// read the most recent byte (which will be from 0 to 255):
brightness = Serial.read();
// set the brightness of the LED:
analogWrite(ledPin, brightness);
},Serial.available()和Serial.read()函数的使用,Serial.read()返回字节输入!返回33,a返回97,返回为int型,Serial.available()
if (Serial.read() == '\n') {}当读到某个字符时,Serial.print('\n');就是Serial.println();
graph
midi
multiserial
多串口if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
}将串口1的数据写到串口0。串口0的数据传送到串口1。
physicalpixel
‘a’和97是等同的,if (incomingByte == 97) {},97可以换为‘a’,
if (Serial.read() == '\n') {}读到换行字符,
readasciistring
Serial.parseInt()返回下一个整数,长型
serialcallrespone
while (Serial.available() <= 0) {},直到有数据进入串口,跳出循环。
if(Serial.available())和while(Serial.available)和if(Serial.available()>0)还有while(Serial.available()<=0)的区别,
Serial.available() 返回可读字节的数量。
serialcallresponseascii
serialevent
字符串定义String inputString = ""; 布尔类型定义boolean stringComplete = false; inputString = "";字符串置空。char inChar = (char)Serial.read();将读的数据转换为字符,加起来。在两次loop函数之间执行。
virtualcorlormixier
control
arrays
int ledPins[] = {
2, 7, 4, 6, 5, 3
};
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
pinMode(ledPins[thisPin], OUTPUT);
}用数组设置不连续的引脚的输出模式。若引脚连续直接用for循环即可实现。
reverse的功能参见上面连接讲解,
For Loop Iteration
ifstatementconditional
switchcase
switch (range) {
case 0: // your hand is on the sensor
Serial.println("dark");
break;
case 1: // your hand is close to the sensor
Serial.println("dim");
break;
case 2: // your hand is a few inches from the sensor
Serial.println("medium");
break;
case 3: // your hand is nowhere near the sensor
Serial.println("bright");
break;
},switch的用法,
switchcase2
switch (inByte) {
case 'a':
digitalWrite(2, HIGH);
break;
case 'b':
digitalWrite(3, HIGH);
break;
case 'c':
digitalWrite(4, HIGH);
break;
case 'd':
digitalWrite(5, HIGH);
break;
case 'e':
digitalWrite(6, HIGH);
break;
default:
// turn all the LEDs off:
for (int thisPin = 2; thisPin < 7; thisPin++) {
digitalWrite(thisPin, LOW);
}
},switch加defaut
whilestatementconditional
该程序通过while实现校准最大最小值,当读到按钮按下,开始校准,while (digitalRead(buttonPin) == HIGH) {
calibrate();
}
void calibrate() {
// turn on the indicator LED to indicate that calibration is happening:
digitalWrite(indicatorLedPin, HIGH);
// read the sensor:
sensorValue = analogRead(sensorPin);
// record the maximum sensor value
if (sensorValue > sensorMax) {
sensorMax = sensorValue;
}
// record the minimum sensor value
if (sensorValue < sensorMin) {
sensorMin = sensorValue;
}
}
sensor
adxl3xx
可以将模拟或者数字引脚定义为vcc和gnd,先设为输出out,digitalWrite(18, LOW);
digitalWrite(19, HIGH);
}即将a4设为gnd,a5设为vcc
knock
Memsic2125
pulsein(pin,value)pin为int类型,value为high或者low,timeout可选参数,返回值为脉冲的时间单位us,为unsigned long,或者如果没有脉冲返回0,timeout类型为unsigned long,默认为1s,等待脉冲完成的时间。
脉冲宽度转换为加速度的计算方法,
ping
340m/s可转化为29us/cm,则t/29/2即的距离单位cm,1m等于39.37inch,则340m/s转换为74us/inch,t/74/2即为距离单位inch,t的单位为us。long型,自定义函数带参数,有返回值,用return
long microsecondsToCentimeters(long microseconds) {
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}为long型返回值。millisecond毫秒ms,microseconds微秒us
display
bargraph
柱状图,通过运用数组的知识,实现小于动态值亮,低于动态值得灭,
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
// if the array element's index is less than ledLevel,
// turn the pin for this element on:
if (thisLed < ledLevel) {
digitalWrite(ledPins[thisLed], HIGH);
}
// turn off all pins higher than the ledLevel:
else {
digitalWrite(ledPins[thisLed], LOW);
}
}
rowcolumnscanning
const int row[];和const int row[8];int row[];这三种都是错误的,int row[8]是对的。可能和const有关。
const int row[8] = {
2, 7, 19, 5, 13, 18, 12, 16
};或者int row[8]; 数组的另一种定义,方括号的8可有可无。
int pixels[8][8];8必须有没有赋值的数组定义。二维数组
8*8点阵控制,for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
pixels[x][y] = HIGH;
}全部置高灭。
}二维数组初始化,二维数组所有值赋值为高,点阵全灭,
readSensors()该函数实现传感器定位点阵中某个led,不显示,refreshscreen()该函数实现点阵的刷新,即将传感器读到的显示出来。
void refreshScreen() {
// iterate over the rows (anodes):
for (int thisRow = 0; thisRow < 8; thisRow++) {
// take the row pin (anode) high:
digitalWrite(row[thisRow], HIGH);
// iterate over the cols (cathodes):
for (int thisCol = 0; thisCol < 8; thisCol++) {
// get the state of the current pixel;
int thisPixel = pixels[thisRow][thisCol];
// when the row is HIGH and the col is LOW,
// the LED where they meet turns on:
digitalWrite(col[thisCol], thisPixel);
// turn the pixel off:
if (thisPixel == LOW) {
digitalWrite(col[thisCol], HIGH);
}
}
// take the row pin low to turn off the whole row:
digitalWrite(row[thisRow], LOW);
}
}一排然后所有列,二排所有列,等等,将每个坐标用digitalwrite()写一遍,低电平的就亮了int thisPixel = pixels[thisRow][thisCol];pixels[x][y] = LOW;亮过之后写高灭,然后将第一排置低,不使能。第二排开始。
digitalWrite(col[thisPin], HIGH);setup()函数中,表示列为二极管的负端,只要,负端置高,点阵全灭。
x = 7 - map(analogRead(A0), 0, 1023, 0, 7);这种表示方法,可将头尾倒置,
string
characteranalysis
Serial.print("You sent me: \'");这句程序表示打印出,you send me:'。用一个\后加你想打印出的字符,表示如何将一个'打印出来。
Serial.write(thisChar);
Serial.println(thisChar);有区别
if (isDigit(thisChar))数字,if (isAlphaNumeric(thisChar))字母数字的,if (isAlpha(thisChar))字母的,if (isAscii(thisChar))ascii判断,if (isWhitespace(thisChar))空格,if (isControl(thisChar))控制字符,if (isGraph(thisChar)),if (isLowerCase(thisChar))小写字母,if (isPrintable(thisChar))可打印的,if (isPunct(thisChar))可发音的,if (isSpace(thisChar))空格,if (isUpperCase(thisChar))大写字母,if (isHexadecimalDigit(thisChar))16进制判断。
while (true);死循环,Serial.println("\n\nAdding strings together (concatenation):");先空两行。
Serial.println("\nAdding strings together (concatenation):");先空一行
stringThree = stringOne + 123;字符串加数字,得到字符串,stringThree = stringOne + 'A';字符串加单个字符,stringThree = stringOne + "abc";字符串加字符串。long currentTime = millis();millis()函数返回值的类型,unsign long型
stringaddtionoperator
stringTwo = "The millis(): ";stringTwo.concat(millis());得到the millis():191,可以看出string.connect()函数可以将字符串与参数连接起来。
stringcasechange
String stringOne = "<html<head><body>";stringOne.toUpperCase();将srtringone中的字母转换为大写字母。返回值即改变原值。stringTwo.toLowerCase();该函数是小写转换,功能与上述函数一样。
stringcharacter
String reportString = "SensorReading: 456";char mostSignificantDigit = reportString.charAt(15);
string.charat(15)为从0开始将15那个字符取出来,即第16个,不改变原值。reportString.setCharAt(13, '=');从0开始将13位的那个字符替换为等号。即将:替换为等号。
stringcomparisionoperators
Serial.println("StringOne == \"this\"");打印出stringone=="this",if (stringOne.equals(stringTwo))判断两个字符串是否相等。if (stringOne.equalsIgnoreCase(stringTwo))表示stringone忽略大写和string是否相等。不改变原值,if (stringOne.toInt() == numberOne)将stringone转换为int型,改变原值。stringOne = "2";
stringTwo = "1";
if (stringOne >= stringTwo) {
Serial.println(stringOne + " >= " + stringTwo);
}数字型的字符串也可进行比较。stringOne = String("Brown");
stringOne = String("Brown");
if (stringOne >"Charles") {
Serial.println(stringOne + " < Charles");
}字符串也可进行比较,通过首字母排序,若首字母一样,则比较第二个字母,依次向下。"Brown"和"Adams"前者大于后者,"Browle"和"Brown"前者小于后者。
if (stringOne.compareTo(stringTwo) < 0)字符串1和字符串2比较,主要通过ascii码比较,从第一个字符开始比较,a是在A之后的,依次比较下去。
stringconstructors
stringOne =String(analogRead(A0), DEC);stringOne = String(13);stringOne = String(45, HEX);
stringOne = String(255, BIN);stringOne = String(millis(), DEC);stringOne = String(5.698, 3);返回5.698。stringOne = String(5.698, 2);返回为5.70
stringindexof
String stringOne = "<html><head><body>";int firstClosingBracket = stringOne.indexOf('>');查找第一个>符号的位置。从0开始到5,int secondOpeningBracket = firstClosingBracket + 1;
int secondClosingBracket = stringOne.indexOf('>', secondOpeningBracket);切换位置,从6开始查找下一个>符号。返回位置。
int bodyTag = stringOne.indexOf("<body>");直接返回该字符串第一个字符所在位置。
int firstListItem = stringOne.indexOf("<li>");
int secondListItem = stringOne.indexOf("li", firstListItem + 1);第一个变量加1,主要目的为了查找第二个字符串。
int lastOpeningBracket = stringOne.lastIndexOf('<');直接查找最后一个<符号所在位置,字符也可以换为字符串。
int lastParagraph = stringOne.lastIndexOf("<p");
int secondLastGraf = stringOne.lastIndexOf("<p",lastParagraph - 1);第一个变量位置为为倒数第一个<p字符的位置,减一之后为查找倒数第二个<p字符服务。
stringlength
String txtMsg = "";定义空字符串,String("Brown");txtMsg.length();返回字符串的长度。
stringlengthtrim
String stringOne = "Hello! ";空格也是字符。stringOne.trim();可将空格去掉。改变原值。
stringreplace
String stringOne = "<html><head><body>";字符串定义。stringTwo.replace("<", "</");字符串替换。String leetString = normalString;
leetString.replace('o', '0');
leetString.replace('e', '3');
stringstartswithendswith
if (stringOne.startsWith("HTTP/1.1")) {
Serial.println("Server's using http version 1.1");
}字符串开始以"HTTP/1.1"条件判断。默认的第二个参数为位置0,
if (stringOne.startsWith("200 OK", 9)) {
Serial.println("Got an OK from the server");
}从9位置开始判断200 ok或者其他字符串,是否完全一致。
if (sensorReading.endsWith("0"))判断该字符串是否以0结尾,
stringsubstring
if (stringOne.substring(19) == "html")字符串从19到最后,是否为"html",if (stringOne.substring(14, 18) == "text")判断14位到18位是否为"text"。
stringtoint
串口监视器, no line ending没有结束符,newline换行符,carriage return回车符,both nl&cr二者兼有。
\n表示换行符,int inChar = Serial.read();
if (isDigit(inChar)) {
// convert the incoming byte to a char
// and add it to the string:
inString += (char)inChar;
}判断读到的值是否为数字,是的话执行,转换为字符串加起来,if (inChar == '\n')表示读到换行符时,Serial.println(inString.toInt());将字符串转换为int型打印出来。转换改变原值为int型。while (Serial.available() > 0) {},
usb该目录下的实例主要不是uno。
keyboard
keyboardlogout
该实例针对leonardo或者micro
switch (platform) {
case OSX:
Keyboard.press(KEY_LEFT_GUI);
// Shift-Q logs out:
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press('Q');
delay(100);
Keyboard.releaseAll();
// enter:
Keyboard.write(KEY_RETURN);
break;
case WINDOWS:
// CTRL-ALT-DEL:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_DELETE);
delay(100);
Keyboard.releaseAll();
//ALT-l:
delay(2000);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('l');
Keyboard.releaseAll();
break;
case UBUNTU:
// CTRL-ALT-DEL:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_DELETE);
delay(1000);
Keyboard.releaseAll();
// Enter to confirm logout:
Keyboard.write(KEY_RETURN);
break;
},switch中不用default的情况。
starterkit_basickit
p02_spaceshipinterface
p03_loveomter
float voltage = (sensorVal / 1024.0) * 5.0;模拟口电压转换,为float类型
p04_colormixinglamp
p05_servomoodindicator
Servo myServo; // create a servo object创建一个对象,myServo.attach(9); // attaches the servo on pin 9 to the servo object引脚绑定,angle = map(potVal, 0, 1023, 0, 179);舵机角度整定,myServo.write(angle);写角度,
p06_lighttheremin
while (millis() < 5000) {
// record the maximum sensor value
sensorValue = analogRead(A0);
if (sensorValue > sensorHigh) {
sensorHigh = sensorValue;
}
// record the minimum sensor value
if (sensorValue < sensorLow) {
sensorLow = sensorValue;
}
}花5秒整定最大最小值。
p07_keyboard
noTone(8);为关闭蜂鸣器。
p08_digitalhuorglass
lcdcrystal
autoscroll
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//rs,en,d4,d5,d6,d7初始化对象r/w接地,lcd.begin(16, 2);初始化列和行lcd.setCursor(0, 0);设置光标位置为(0,0),lcd.print(thisChar);lcd显示字符,lcd.clear();清屏,lcd.autoscroll();
lcd.noAutoscroll();关闭滚动模式。lcd.setCursor(16, 1);设置光标到1行16列。
blink
lcd.autoscroll(),打开滚动模式,lcd.noBlink();光标停止闪烁,lcd.blink();闪烁光标。
lcd.print("hello, world!");在屏幕上显示内容
cursor
lcd.noCursor();隐藏光标,lcd.cursor();显示光标。
customcharacter
byte heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};二进制数组定义。
lcd.createChar(0, heart);自造字符,最多5*8像素,编号0-7,lcd.write(byte(0));
display
lcd.noDisplay();关闭显示,lcd.display();打开显示,lcd.setCursor(0, 1);设置光标位置,坐标的第一个数为列,第二个数为行。
helloworld
scroll
lcd.scrollDisplayLeft();把显示的内容向左滚动一格,lcd.scrollDisplayRight();把显示的内容向右滚动一格。
serialdisplay
if (Serial.available())
while (Serial.available() > 0) {
// display each character to the LCD
lcd.write(Serial.read());
}。用lcd写出来。
serial.available()函数返回值,the number of bytes available to read
setcursor
lcd.setCursor(thisCol, thisRow);设置坐标的位置。lcd.write(thisLetter);将数据写到屏幕上。
textdirection
lcd.cursor();光标显示打开。
lcd.leftToRight(),该函数从左往右显示。lcd.home();把光标移回左上角。
onewire
ds18x20_temperature
OneWire ds(2);定义一个对象,
宏定义
#define Aims_Range 30
#define Barrier_Range 30
#define Scanning_Range 10
#define Alarm 1
#define Safety 0
枚举类型的数据结构
typedef enum
{
Arm_Start,
Arm_Turn_Left,
Arm_Turn_Right,
Arm_Stretch1, //后,初始位置
Arm_Stretch2, //中,检测位置
Arm_Stretch3, //钱,抓取位置
Arm_Up,
Arm_Down,
Hand_Up,
Hand_Down,
Hand_Open,
Hand_Close
}Type_Machine_Hand;//Type_Run成为一种新的数据类型。
Type_Run Run;用Type_Run定义这种类型的变量。
Type_DC_Motor DC_Motor_Left;
Servo servo_spin;初始化对象。
int Deg_Buffer[3]={0,Servo_Spin_Init_Deg,Servo_Hand_Init_Deg}; //数组第一个没用为的是对其//定义一个数组。
arduino核心库中定义了常数pi,int为32位,2的32为t,则-t/2----t/2-1,unsignde int (0----t-1),long 型为32位,和int的范围一样。unsigned long和unsigned int一样。short类型16位,范围为-t/2----t/2-1。
字符型变量占一个字节。布尔占用一个字节空间。arduino中的浮点变量有两种类型。float和double,字符串有
单个数码管,
const unsigned char LED8Code[]={//共阳极数码管。位为零即亮。
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
0x88, // A
0x83, // B
0xC6, // C
0xA1, // D
0x86, // E
0x8E // F
};数码的16进制形式。
j = bitRead( LED8Code[data],i);bitread函数读字节时从最低位置开始来读。所以引脚定义数组时,需要将引脚定义的dp放在最后,digitalWrite(LED8Pin[i], j);j = bitRead( LED8Code[data],i);因为数码管16进制是从dp-a,所以j也得从dp开始即将dp放在数组的最后端,即引脚是从(a-dp)pin。const unsigned char LED8Pin[]={
6,7,8,10,11,13,12,9};//A B C D E F G Dp。
return 关键字对测试一段代码很方便,不需“注释掉”大段的可能是错误的代码。将return放在错误的程序之前,错误的程序永远也不执行。
终止一个函数,并向被调用函数并返回一个值,如果你想的话。这时你需要让return 加返回值。