我爱编程

arduino实例程序难点汇总

2018-04-15  本文已影响167人  麦牛2013

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循环即可实现。

inputString.reserve(200);

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 加返回值。

上一篇下一篇

猜你喜欢

热点阅读