【Arduino】语言参考功能
前言
翻译Arduino 参考处列出的常用函数。文中为了减少篇幅,达到能快速翻到查询的目标,在介绍函数中,对部分内容进行了省略,不会列出函数输入参数类型,以及使用注意事项等等,所以若是首次使用或者是调试时出现问题,建议查看原文。Arduino参考网址下,共介绍了三大块,功能
、变量
、结构
,下面就只对功能
板块进行整理。
功能
用于控制 Arduino 板和执行计算
数字 I/O
digitalRead()
描述:从指定的数字引脚读取值 语法:digitalRead(pin) 返回:HIGH
或LOW
示例代码:将引脚 13 设置为与引脚 7 相同的值,声明为输入。
int ledPin = 13; // LED连接到数字pin13
int inPin = 7; // 按钮连接到数字pin7
int val = 0; // 变量来存储读取的值void setup() {pinMode(ledPin, OUTPUT); // 将数字pin13设置为输出pinMode(inPin, INPUT); // 将数字pin7设置为输入
}void loop() {val = digitalRead(inPin); // 读取输入引脚digitalWrite(ledPin, val); // 设置LED为按钮的值
}
digitalWrite()
描述:指定的数字引脚写入HIGH
或LOW
语法:digitalWrite(pin, value) 返回:无
示例代码:该代码使数字pin为13,并以1秒钟的速度在和之间交替切换高低电平。
void setup() {pinMode(13, OUTPUT); // 设置数字引脚13作为输出
}void loop() {digitalWrite(13, HIGH); // 设置数字引脚13delay(1000); // 等待1秒钟digitalWrite(13, LOW); // 设置数字引脚13关闭delay(1000); // 等待1秒钟
}
pinMode()
描述:将指定的引脚配置为 input 或 output 语法:pinMode(pin, mode) 返回:无
示例代码:该代码使数字pin为13,并以1秒钟的速度在和之间交替切换高低电平。
void setup() {pinMode(13, OUTPUT); // 设置数字引脚13作为输出
}void loop() {digitalWrite(13, HIGH); // 设置数字引脚13delay(1000); // 等待1秒钟digitalWrite(13, LOW); // 设置数字引脚13关闭delay(1000); // 等待1秒钟
}
模拟 I/O
analogRead()
描述:从指定的模拟引脚读取值 语法:analogRead(pin) 返回:引脚上的模拟读数。尽管它仅限于模数转换器的分辨率(0-1023 位或 0-4095 位 12),数据类型为int
示例代码:该代码读取模拟引脚上的电压并打印它
int analogPin = A3; // 电位器中间端子连接到模拟引脚3// 外部引出地和+5V
int val = 0; // 变量来存储读取的值void setup() {Serial.begin(9600); // 设置波特率
}void loop() {val = analogRead(analogPin); // 读取输入引脚Serial.println(val); // 打印出模拟值
}
analogReadResolution()
描述:该函数是部分系列的模拟API扩展,允许设置ADC分辨率 语法:analogReadResolution(bits) 返回:无
示例代码:该代码显示了如何使用不同分辨率的 ADC
void setup() {// 打开串口Serial.begin(9600);
}void loop() {// 以默认分辨率(10位)在A0上读取输入// 然后通过串口发送出去analogReadResolution(10);Serial.print("ADC 10-bit (default) : ");Serial.print(analogRead(A0));// 将分辨率更改为12位并读取A0analogReadResolution(12);Serial.print(", 12-bit : ");Serial.print(analogRead(A0));// 将分辨率更改为16位并读取AOanalogReadResolution(16);Serial.print(", 16-bit : ");Serial.print(analogRead(A0));// 将分辨率更改为8位并读取AOanalogReadResolution(8);Serial.print(", 8-bit : ");Serial.println(analogRead(A0));// 一点延迟,以避免占用串行监视器delay(100);
}
analogReferenc()
描述:配置用于模拟输入的参考电压 语法:analogReference(type) 返回:无
analogWrite()
描述:将模拟值 (PWM波) 写入引脚 语法:analogWrite(pin, value) 返回:无
示例代码:将 LED 的输出设置为与从电位计读取的值成比例。
int ledPin = 9; // LED连接到数字引脚9
int analogPin = 3; // 电位器连接到模拟引脚3
int val = 0; // 变量来存储读值void setup() {pinMode(ledPin, OUTPUT); // 将引脚设置为输出
}void loop() {val = analogRead(analogPin); // 读取输入引脚analogWrite(ledPin, val / 4); // 模拟值从0到1023,模拟值从0到255
}
analogWriteResolution()
描述:该函数是ArduinoDue 的 Analog API 的扩展,用于设置函数的分辨率。 语法:analogWriteResolution(bits) 返回:无
示例代码:解释代码
void setup() {// 打开串口Serial.begin(9600);// 使我们的数字引脚输出pinMode(11, OUTPUT);pinMode(12, OUTPUT);pinMode(13, OUTPUT);
}void loop() {// 读取A0上的输入并将其映射到PWM引脚// 带有1个LEDint sensorVal = analogRead(A0);Serial.print("Analog Read) : ");Serial.print(sensorVal);// 默认PWM分辨率analogWriteResolution(8);analogWrite(11, map(sensorVal, 0, 1023, 0, 255));Serial.print(" , 8-bit PWM value : ");Serial.print(map(sensorVal, 0, 1023, 0, 255));// 将PWM分辨率改为12位// 仅支持完整的12位分辨率analogWriteResolution(12);analogWrite(12, map(sensorVal, 0, 1023, 0, 4095));Serial.print(" , 12-bit PWM value : ");Serial.print(map(sensorVal, 0, 1023, 0, 4095));// 将PWM分辨率改为4位analogWriteResolution(4);analogWrite(13, map(sensorVal, 0, 1023, 0, 15));Serial.print(", 4-bit PWM value : ");Serial.println(map(sensorVal, 0, 1023, 0, 15));delay(5);
}
高级 I/O
noTone()
描述:阻止方波生成语法,如果未生成方波,则无效 语法:noTone(pin) 返回:无
pulseIn()
描述:读取引脚上的脉冲,超时未收到完整脉冲,则返回0 语法:pulseIn(pin, value) 或 pulseIn(pin, value, timeout) 返回:脉冲的长度(以微秒为单位)或 0(如果在超时之前没有脉冲启动)。数据类型为unsigned long
示例代码:该示例打印引脚 7 上脉冲的持续时间。
int pin = 7;
unsigned long duration;void setup() {Serial.begin(9600);pinMode(pin, INPUT);
}void loop() {duration = pulseIn(pin, HIGH);Serial.println(duration);
}
pulseInLong()
描述:该函数
是pulseIn() 的替代方案,它更擅长处理受长脉冲和中断影响的场景。 语法:pulseInLong(pin, value) 或 pulseInLong(pin, value, timeout) 返回:脉冲的长度(以微秒为单位)或 0(如果在超时之前没有脉冲启动)。数据类型为unsigned long
示例代码:该示例打印引脚 7 上脉冲的持续时间
int pin = 7;
unsigned long duration;void setup() {Serial.begin(9600);pinMode(pin, INPUT);
}void loop() {duration = pulseInLong(pin, HIGH);Serial.println(duration);
}
shiftIn()
描述:1次移入1个字节的数据,高位到低位。从移位寄存器或其他串行设备逐位读取数据(软件SPI流程) 语法:byte incoming = shiftIn(dataPin, clockPin, bitOrder) 返回:读取值,数据类型为byte
shiftOut()
描述:1次移出1个字节的数据,高位到低位。移出到移位寄存器或其他串行设备(软件SPI流程) 语法:shiftOut(dataPin, clockPin, bitOrder, value) 返回:
示例代码:有关随附的电路,请参阅有关控制 74HC595 移位寄存器的教程
//**************************************************************//
// Name : shiftOutCode, Hello World //
// Author : Carlyn Maw,Tom Igoe //
// Date : 25 Oct, 2006 //
// Version : 1.0 //
// Notes : Code for using a 74HC595 Shift Register //
// : to count from 0 to 255 //
//****************************************************************// 引脚连接到74HC595的ST_CP
int latchPin = 8;
// 引脚连接到74HC595的SH_CP
int clockPin = 12;
// 引脚连接到74HC595的DS
int dataPin = 11;void setup() {// 将引脚设置为输出,因为它们是在主循环中寻址的pinMode(latchPin, OUTPUT);pinMode(clockPin, OUTPUT);pinMode(dataPin, OUTPUT);
}void loop() {// 计数程序for (int j = 0; j < 256; j++) {// 接地锁脚并保持低位,只要你正在传输digitalWrite(latchPin, LOW);shiftOut(dataPin, clockPin, LSBFIRST, j);// 将锁存引脚拉高,以向芯片发出信号表示它// 不再需要监听信息digitalWrite(latchPin, HIGH);delay(1000);}
}
tone()
描述:在引脚上生成指定频率 (和 50% 占空比) 的方波 语法:tone(pin, frequency)或tone(pin, frequency, duration) 返回:无
时间
delay()
描述:将程序暂停指定为一定的时间量 (以毫秒为单位) 语法:delay(ms) 返回:无
delayMicroseconds()
描述:将程序暂停参数指定的时间量 (以微秒为单位) 语法:delayMicroseconds(us) 返回:无
micros()
描述:返回自 Arduino 板开始运行当前程序以来的微秒数 语法:time = micros() 返回:返回自 Arduino 板开始运行当前程序以来的微秒数。数据类型为unsigned long
示例代码:该代码返回自 Arduino 板开始以来的微秒数。
unsigned long time;void setup() {Serial.begin(9600);
}
void loop() {Serial.print("Time: ");time = micros();Serial.println(time); // 打印程序启动后的时间delay(1000); // 稍等片刻,以免发送大量数据
}
millis()
描述:返回自 Arduino 板开始运行当前程序以来经过的毫秒数 语法:time = millis() 返回:自程序启动以来经过的毫秒数。数据类型为unsigned long
示例代码:此示例代码在串行端口上打印自 Arduino 板开始运行代码本身以来经过的毫秒数。
unsigned long myTime;void setup() {Serial.begin(9600);
}
void loop() {Serial.print("Time: ");myTime = millis();Serial.println(myTime); // 打印程序启动后的时间delay(1000); // 稍等片刻,以免发送大量数据
}
数学
abs()
描述:计算数字的绝对值 语法:abs(x) 返回:绝对值
示例代码:将变量的绝对值打印到串行监视器
void setup() {Serial.begin(9600);while (!Serial) {; // 等待串口连接。只需要本地USB端口}int x = 42;Serial.print("The absolute value of ");Serial.print(x);Serial.print(" is ");Serial.println(abs(x));x = -42;Serial.print("The absolute value of ");Serial.print(x);Serial.print(" is ");Serial.println(abs(x));
}void loop() {
}
constrain()
描述:将数字限制在一个范围内 语法:constrain(x, a, b) 返回:如果 x 介于 a 和 b 之间,返回x。如果x小于a,返回a。如果x大于b,返回b。
示例代码:该代码将传感器值限制为 10 到 150 之间。
sensVal = constrain(sensVal, 10, 150); // 将传感器值的范围限制在10和150之间
map()
描述:将数字从一个范围重新映射到另一个范围 语法:map(value, fromLow, fromHigh, toLow, toHigh) 返回:映射的值,数据类型为long
示例代码:
/* 将模拟值映射到8位(0到255) */
void setup() {}void loop() {int val = analogRead(0);val = map(val, 0, 1023, 0, 255);analogWrite(9, val);
}
max()
描述:计算最多两个数字 语法:max(x, y) 返回:两个参数值中较大的一个
示例代码:该代码确保 sensVal 至少为 20。
sensVal = max(sensVal, 20); // 将sensVal赋值给sensVal或中较大的值20// (有效地确保它至少20)
min()
描述:计算两个数字的最小值 语法:min(x, y) 返回:两个数字中较小的一个
示例代码:该代码确保它永远不会超过 100
sensVal = min(sensVal, 100); // 将senval分配给senval或100中较小的值// 确保它不会超过100
pow()
描述:计算提高到幂数的数字的值 语法:pow(base, exponent) 返回:幂的结果,数据类型为double
示例代码:计算 x 的值 y 的幂
z = pow(x, y);
sq()
描述:计算数字的平方,数字乘以自身 语法:sq(x) 返回:数字的平方,数据类型为double
sqrt()
描述:计算数字的平方根 语法:sqrt(x) 返回:数字的平方根,数据类型为double
三角法
cos()
描述:计算角度的余弦值 (以弧度为单位),结果将介于 -1 和 1 之间 语法:cos(rad) 返回:角度的 cos,数据类型为double
sin()
描述:计算角度的正弦值 (以弧度为单位),结果将介于 -1 和 1 之间 语法:sin(rad) 返回:角度的正弦值,数据类型为double
tan()
描述:计算角度的正切值 (以弧度为单位),结果将介于负无穷大和无穷大之间 语法:tan(rad) 返回:角度的正切值,数据类型为double
字符
isAlpha()
描述:分析输入是否为字母,如果输入包含字母,则返回 true 语法:isAlpha(thisChar) 返回:如果thisChar是字母,返回true
示例代码:
if (isAlpha(myChar)) { // 测试mychar是否是字母Serial.println("The character is a letter");
}
else {Serial.println("The character is not a letter");
}
isAlphaNumeric()
描述:分析输入是否为字母或数字,如果输入包含数字或字母,则返回 true 语法:isAlphaNumeric(thisChar) 返回:如果 thisChar 是字母数字,返回true
示例代码:
if (isAlphaNumeric(myChar)) { // 测试myChar是字母还是数字Serial.println("The character is alphanumeric");
}
else {Serial.println("The character is not alphanumeric");
}
isAscii()
`
描述:分析 char 是否为 Ascii。如果 thisChar 包含 Ascii 字符,则返回 true 语法:isAscii(thisChar) 返回:如果 thisChar 是 Ascii,返回true
示例代码:
if (isAscii(myChar)) { // 测试mychar是否是Ascii字符Serial.println("The character is Ascii");
}
else {Serial.println("The character is not Ascii");
}
isControl()
描述:分析 char 是否为控制字符。如果 thisChar 是控制字符,则返回 true 语法:isControl(thisChar) 返回:如果 thisChar 是控制字符,返回true
示例代码:
if (isControl(myChar)) { // 测试mychar是否是控制字符Serial.println("The character is a control character");
}
else {Serial.println("The character is not a control character");
}
isDigit()
描述:分析 char 是否为数字 。如果 thisChar 是一个数字,则返回 true 语法:isDigit(thisChar) 返回:如果 thisChar 是一个数字,返回true
示例代码:
if (isDigit(myChar)) { // 测试mychar是否是数字Serial.println("The character is a number");
}
else {Serial.println("The character is not a number");
}
isGraph()
描述:分析字符是否可打印某些内容(空间可打印,但没有内容)。如果 thisChar 是可打印的,则返回 true 语法:isGraph(thisChar) 返回:如果 thisChar 是可打印的,返回true
示例代码:
if (isGraph(myChar)) { // 测试myChar是否是可打印字符,但不是空格Serial.println("The character is printable");
}
else {Serial.println("The character is not printable");
}
isHexadecimalDigit()
描述:分析 char 是否为十六进制数字 (A-F, 0-9)。如果 thisChar 包含十六进制数字,则返回 true 语法:isHexadecimalDigit(thisChar) 返回:如果 thisChar 是十六进制数字,返回true
示例代码:
if (isHexadecimalDigit(myChar)) { // 测试myChar是否为十六进制数字Serial.println("The character is an hexadecimal digit");
}
else {Serial.println("The character is not an hexadecimal digit");
}
isLowerCase()
描述:分析 char 是否为小写 (即小写字母) 。如果 thisChar 包含小写字母,则返回 true 语法:isLowerCase(thisChar) 返回:如果 thisChar 为小写,返回true
示例代码:
if (isLowerCase(myChar)) { // 测试myChar是否是小写字母Serial.println("The character is lower case");
}
else {Serial.println("The character is not lower case");
}
isPrintable()
描述:分析字符是否可打印(即生成输出的任何字符,甚至是空格)。如果 thisChar 是可打印的,则返回 true 语法:isPrintable(thisChar) 返回:如果 thisChar 是可打印的,返回true
示例代码:
if (isPrintable(myChar)) { // 测试mychar是否是可打印的charSerial.println("The character is printable");
}
else {Serial.println("The character is not printable");
}
isPunct()
描述:分析 char 是否为标点符号(即逗号、分号、感叹号等)。如果 thisChar 是标点符号,则返回 true 语法:isPunct(thisChar) 返回:如果 thisChar 是标点符号,返回true
示例代码:
if (isPunct(myChar)) { // 测试mychar是否是标点符号Serial.println("The character is a punctuation");
}
else {Serial.println("The character is not a punctuation");
}
isSpace()
描述:分析 char 是否为空白字符。如果参数是空格、换页符 (\f)、换行符 (\n)、回车符 (\r)、水平制表符 (\t)或垂直制表符(\v),则返回 true 语法:isSpace(thisChar) 返回:如果 thisChar 是空白字符,返回true
示例代码:
if (isSpace(myChar)) { // 测试mychar是否是空白字符Serial.println("The character is white-space");
}
else {Serial.println("The character is not white-space");
}
isUpperCase()
描述:分析 char 是否为大写 (即大写字母) 。如果 thisChar 为大写,则返回 true 语法:isUpperCase(thisChar) 返回:如果 thisChar 是大写的,返回true
示例代码:
if (isUpperCase(myChar)) { // 测试mychar是否是大写字母Serial.println("The character is upper case");
}
else {Serial.println("The character is not upper case");
}
isWhitespace()
描述:分析 char 是否为空格字符。如果参数是空格或水平制表符 (\t),则返回 true 语法:isWhitespace(thisChar) 返回:如果 thisChar 是空格字符,返回true
if (isWhitespace(myChar)) { // 测试mychar是否是一个空格字符Serial.println("The character is a space or tab");
}
else {Serial.println("The character is not a space or tab");
}
随机数
random()
描述:该函数生成伪随机数 语法:random(max) 或者random(min, max) 返回:介于 min 和 max-1 之间的随机数,数据类型为long
示例代码:该代码生成随机数并显示它们
long randNumber;void setup() {Serial.begin(9600);// 如果模拟输入引脚0未连接,则随机模拟// 噪声将导致对randomSeed()的调用生成// 每次草图运行时,不同的种子数量// randomSeed()然后对随机函数进行洗牌randomSeed(analogRead(0));
}void loop() {// 打印一个从0到299的随机数randNumber = random(300);Serial.println(randNumber);// 打印一个从10到19的随机数randNumber = random(10, 20);Serial.println(randNumber);delay(50);
}
randomSeed()
描述:randomSeed()
初始化伪随机数生成器,使其从其随机序列中的任意点开始 语法:randomSeed(seed) 返回:无
示例代码:该代码生成一个伪随机数,并将生成的数字发送到串行端口
long randNumber;void setup() {Serial.begin(9600);randomSeed(analogRead(0));
}void loop() {randNumber = random(300);Serial.println(randNumber);delay(50);
}
位和字节
bit()
描述:计算指定位的值(位 0 为 1,位 1 为 2,位 2 为 4,依此类推) 语法:bit(n) 返回:位的值
bitClear()
描述:清除 (写入 0) 数值变量的位 语法:bitClear(x, n) 返回:清除位置位后的数值变量值
示例代码:打印两个给定整数的输出。6 的二进制表示形式为 0110,因此当 时,从右侧开始的第二位设置为 0。在此之后,我们只剩下二进制的 0100,因此返回 4
void setup() {Serial.begin(9600);while (!Serial) {; // 等待串口连接。只需要本机USB端口}int x = 6;int n = 1;Serial.print(bitClear(x, n)); // 输出bitclear(x,n)的输出
}void loop() {
}
bitRead()
描述:读取变量中的某一位 语法:bitRead(x, n) 返回:位的值 (0 或 1)
示例代码:此示例代码演示了如何读取两个变量,一个递增计数器,一个递减计数器,并打印出变量的二进制值和十进制值。readBit()函数遍历变量的每个位(从最右边的位开始),并将其打印出来
long negative_var = -0; //
unsigned long long positive_var = 0;// 在遍历位时预定义的大小
// 例如,long_size是32位(0-31)。因此,我们减去“1”。
const int bool_size = (1 - 1);
const int int_size = (8 - 1);
const int long_size = (32 - 1);void setup() {Serial.begin(9600);
}void loop() {// 运行readBit函数,传递pos、neg变量readBit("Positive ", positive_var);readBit("Negative ", negative_var);Serial.println();// 增加和减少变量值negative_var--;positive_var++;delay(1000);
}/* 这个函数接受一个变量,逐位打印出来(从右开始),然后打印小数以供比较。 */
void readBit(String direction, long counter) {Serial.print(direction + "Binary Number: ");// 遍历每个位for (int b = long_size; b >= 0; b--) {byte bit = bitRead(counter, b);Serial.print(bit);}Serial.print(" Decimal Number: ");Serial.println(counter);
}
bitSet()
描述:设置(写入 1)一个数字变量的位 语法:bitSet(x, n) 返回:设置位置后的数值变量的值
示例代码:打印两个给定整数的输出。4 的二进制表示形式是 0100,因此当 时,从右数第二位设置为 1。在此之后,我们只剩下二进制的 0110,因此返回 6
void setup() {Serial.begin(9600);while (!Serial) {; // 等待串口连接。只需要本机USB端口}int x = 4;int n = 1;Serial.print(bitSet(x, n)); // 输出bitset(x,n)的输出
}void loop() {
}
bitWrite()
描述:写入变量的位 语法:bitWrite(x, n, b) 返回:无
示例代码:通过在使用 之前和之后将变量的值打印到串行监视器来演示 bitWrite 的使用
void setup() {Serial.begin(9600);while (!Serial) {} // 等待串口连接。只需要本地USB端口byte x = 0b10000000; // 0b 前缀表示二进制常数Serial.println(x, BIN); // 10000000bitWrite(x, 0, 1); // 把1写到x的最低有效位Serial.println(x, BIN); // 10000001
}void loop() {}
highByte()
描述:提取变量的高字节(最左侧) 语法:highByte(x) 返回:数据类型为byte
lowByte()
描述:提取变量的低字节(最右侧) 语法:lowByte(x) 返回:数据类型为byte
外部中断
attachInterrupt()
描述:带中断的数字引脚, 语法:attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) 返回:无
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;void setup() {pinMode(ledPin, OUTPUT);pinMode(interruptPin, INPUT_PULLUP);attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}void loop() {digitalWrite(ledPin, state);
}void blink() {state = !state;
}
detachInterrupt()
描述:关闭给定的中断 语法:detachInterrupt(digitalPinToInterrupt(pin)) 返回:无
digitalPinToInterrupt()
描述:该函数将 pin 作为参数,如果可以用作中断,则返回相同的 pin 语法:digitalPinToInterrupt(pin) 返回:要中断的引脚(例如2
),如果 pin 不可用于中断,则返回 -1
示例代码:此示例检查引脚是否可以用作中断
int pin = 2;void setup() {Serial.begin(9600);int checkPin = digitalPinToInterrupt(pin);if (checkPin == -1) {Serial.println("Not a valid interrupt pin!");} else {Serial.println("Valid interrupt pin.");}
}void loop() {
}
中断
interrupts()
描述:重新启用中断(在它们被noInterrupts()
禁用之后)。中断允许某些重要任务在后台进行,并且默认情况下处于启用状态。禁用中断时,某些功能将不起作用,并且传入的通信可能会被忽略。但是,中断可能会略微中断代码的计时,并且可能会对代码的特别关键部分禁用 语法:interrupts() 返回:无
示例代码:该代码启用 interrupts
void setup() {}void loop() {noInterrupts();// 这里是关键的、时间敏感的代码interrupts();// 这里的其他代码
}
noInterrupts()
描述:禁用中断(你可以使用 interrupts()
) 重新启用它们)。中断允许某些重要任务在后台进行,并且默认情况下处于启用状态。禁用中断时,某些功能将不起作用,并且传入的通信可能会被忽略。但是,中断可能会略微中断代码的计时,并且可能会对代码的特别关键部分禁用 语法:noInterrupts() 返回:无
示例代码:该代码演示如何启用中断
void setup() {}void loop() {noInterrupts();// 这里是关键的、时间敏感的代码interrupts();// 这里的其他代码
}
通信
Print
描述:Print 类是一个抽象基类,它提供了一个用于将数据打印到不同输出设备的通用接口。它定义了几种允许以不同格式打印数据的方法。Print 类与 Arduino 中的多个库相关,这些库使用打印功能与串行监视器、LCD 屏幕、打印机等设备进行交互。
功能:write()
、print()
、println()
write()
此函数响应来自控制器设备的请求从外围设备写入数据,或将字节排队以从控制器传输到外围设备
// 常用语法
Wire.write(value)
Wire.write(string)
Wire.write(data, length)// 示例程序
#include <Wire.h>
byte val = 0;
void setup() { Wire.begin(); /* 加入I2C总线 */ }
void loop() { Wire.beginTransmission(44); // 发送到设备号 44 (0x2C)Wire.write(val); // 发送值字节Wire.endTransmission(); // 停止传输val++; // 自增// 如果达到第64位(最大值)if(val == 64) {val = 0; // 从最小值开始}delay(500);
}
print()
将数据作为人类可读的 ASCII 文本打印到串行端口。此命令可以采用多种形式。
// 常用语法
Serial.print(val)
Serial.print(val, format)
// 示例程序
/* 使用for循环以各种格式打印数字 */
void setup() {Serial.begin(9600); // 以9600bps的速度打开串口
}void loop() {// 打印Serial.print("NO FORMAT"); // 打印标签Serial.print("\t"); // 打印制表符Serial.print("DEC");Serial.print("\t");Serial.print("HEX");Serial.print("\t");Serial.print("OCT");Serial.print("\t");Serial.print("BIN");Serial.println(); // 最后一个标签后回车for (int x = 0; x < 64; x++) { // 只有部分ASCII图表,更改以适应// 以多种格式列印:Serial.print(x); // 打印为ASCII编码的十进制-与“DEC”相同Serial.print("\t\t"); // 打印两个标签以适应标签长度Serial.print(x, DEC); // 打印为ASCII编码的十进制Serial.print("\t"); // 打印制表符Serial.print(x, HEX); // 打印为ASCII编码的十六进制Serial.print("\t"); // 打印制表符Serial.print(x, OCT); // 打印为ASCII编码的八进制Serial.print("\t"); // 打印制表符Serial.println(x, BIN); // 打印为ASCII编码的二进制文件// 然后用“println”加上回车符delay(200); // 延迟200毫秒}Serial.println(); // 输出另一个回车
}
println()
将数据作为人类可读的 ASCII 文本打印到串行端口,后跟回车符(ASCII 13 或“\r”)和换行符(ASCII 10 或“\n”)。此命令采用与 Serial.print()
相同的形式。
Serial
用于 Arduino 板与计算机或其他设备之间的通信
// 基于Serial对象下,提供下述功能函数
if(Serial)
available()
availableForWrite()
begin()
end()
find()
findUntil()
flush()
parseFloat()
parseInt()
peek()
print()
println()
read()
readBytes()
readBytesUntil()
readString()
readStringUntil()
setTimeout()
write()
serialEvent()
SPI
此库允许您与 SPI 设备通信,并将 Arduino 作为控制器设备。此库与每个 Arduino 平台捆绑在一起,因此您无需单独安装该库
// 基于SPI对象下,提供下述功能函数
SPISettings
begin()
beginTransaction()
endTransaction()
end()
setBitOrder()
setClockDivider()
setDataMode()
transfer()
usingInterrupt()
Stream
Stream 是基于字符和二进制文件的流的基类。它不是直接调用的,而是在您使用依赖于它的函数时调用。Stream 定义了 Arduino 中的读取函数。当使用任何使用 或类似方法的核心功能时,您可以放心地假设它调用 Stream 类。对于像这样的函数,Stream 继承自 Print 类
// 基于Stream对象下,提供下述功能函数
available()
read()
flush()
find()
findUntil()
peek()
readBytes()
readBytesUntil()
readString()
readStringUntil()
parseInt()
parseFloat()
setTimeout()
Wire
此库允许您与 I2C 设备通信,这是所有 Arduino 板上都有的功能。I2C 是一种非常常见的协议,主要用于向外部 I2C 组件读取/发送数据
// 基于Wire对象下,提供下述功能函数
begin()
end()
requestFrom()
beginTransmission()
endTransmission()
write()
available()
read()
setClock()
onReceive()
onRequest()
setWireTimeout()
clearWireTimeoutFlag()
getWireTimeoutFlag()
USB接口
Keyboard
键盘功能使基于部分的Arduino板能够通过其 micro 的本机 USB 端口将击键发送到连接的计算机
Keyboard.begin()
Keyboard.end()
Keyboard.press()
Keyboard.print()
Keyboard.println()
Keyboard.release()
Keyboard.releaseAll()
Keyboard.write()
Mouse
鼠标功能使基 micro 部分的Arduino板能够通过其 micro 的本机 USB 端口控制所连接计算机上的光标移动。更新光标位置时,它始终相对于光标的先前位置。
Mouse.begin()
Mouse.click()
Mouse.end()
Mouse.move()
Mouse.press()
Mouse.release()
Mouse.isPressed()
相关文章:
【Arduino】语言参考功能
前言 翻译Arduino 参考处列出的常用函数。文中为了减少篇幅,达到能快速翻到查询的目标,在介绍函数中,对部分内容进行了省略,不会列出函数输入参数类型,以及使用注意事项等等,所以若是首次使用或者是调试时出…...
CMake使用CPack制作安装程序
CPack的功能很强大,笔者前面有一博文使用CMake的CPack工具打包项目介绍了一下使用CPack来打包成7z压缩文件,不仅如此,它还可以生成各平台的安装包。 CPack支持以下类型的生成器: 名称文件类型平台及说明STGZSTGZ(.sh)自解压文件…...
Flink运行时架构
一、系统架构 1)作业管理器(JobManager) JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…...
平衡二叉树(力扣110)
所谓平衡二叉树,就是每一个节点的左右子树的高度差不大于1。而一个子树的高度,就是父节点的最大高度。这道题的思路其实和二叉树的最大深度(力扣104)-CSDN博客有很大的相似之处,都需要将左右子树的高度返回给父节点,因此也是采用后…...
【玩转全栈】---基于YOLO8的图片、视频目标检测
本篇主要讲YOLO8的具体操作,想要了解YOLO的具体原理,可以去官网查询 目录 下载ultralytics库 开始检测 介绍 YOLOv8(You Only Look Once Version 8)是 YOLO 系列的最新版本,由 Ultralytics 开发并发布,是一…...
ES6+新特性,var、let 和 const 的区别
在 JavaScript 中,var、let 和 const 都用于声明变量,但它们有一些重要的区别,主要体现在 作用域、可变性和提升机制 等方面。 1. 作用域(Scope) var: var 声明的变量是 函数作用域,也就是说,它…...
汇编实验·分支程序设计
一、实验目的: 1.能够熟练的进行分支程序的编写,掌握条件语句对应的汇编语言指令的实现 2.掌握多个条件的分支语句的实现原理,理解C语言中的逻辑运算“短路”特征 二、实验内容 1.对2和3任务中的C代码在VS2022中运行,设置生成对应的汇编代码,观察生成代码的不同,着重…...
激光线扫相机无2D图像的标定方案
方案一:基于运动控制平台的标定 适用场景:若激光线扫相机安装在可控运动平台(如机械臂、平移台、旋转台)上,且平台的运动精度已知(例如通过编码器或高精度步进电机控制)。 步骤: 标…...
【Python・机器学习】多元回归模型(原理及代码)
前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)&am…...
ubuntu20.04安装使用direct_visual_lidar_calibration标定雷达和相机
官方链接GitHub - koide3/direct_visual_lidar_calibration: A toolbox for target-less LiDAR-camera calibration [ROS1/ROS2] 官方安装方式 Installation - direct_visual_lidar_calibration 安装依赖 sudo apt install libomp-dev libboost-all-dev libglm-dev libglfw…...
Android 自定义View时四个构造函数使用详解
该文章我们以自定义View继承TextView为例来讲解 创建自定义View命名MyTextView,并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…...
linux中关闭服务的开机自启动
引言 systemctl 是 Linux 系统中用于管理 systemd 服务的命令行工具。它可以用来启动、停止、重启服务,管理服务的开机自启动,以及查看服务的状态等。 什么是 systemd? systemd 是现代 Linux 发行版中默认的 初始化系统(init sys…...
【go语言】go的卸载与安装
一、卸载go sudo rm -rf /usr/local/go sudo apt-get remove golang sudo apt-get remove golang-go sudo apt-get autoremove wget https://dl.google.com/go/go1.19.linux-amd64.tar.gz sudo tar -xzf go1.19.linux-amd64.tar.gz -C /usr/local go env -w GOPROXY"http…...
微软Win10 RP 19045.5435(KB5050081)预览版发布!
系统之家1月20日最新报道,微软面向Release Preview频道的Windows Insider项目成员,发布了适用于Windows10 22H2版本的KB5050081更新,更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持,同时新版日历将为…...
VUE elTree 无子级 隐藏展开图标
这4个并没有下级节点,即它并不是叶子节点,就不需求展示前面的三角展开图标! 查阅官方文档如下描述,支持bool和函数回调处理,这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props,注意! :pr…...
python实现代理服务器转换
使用 http.server 模块和 requests 库来实现,代理服务器可拦截匹配指定路径的 HTTP 请求,并打印或存储请求头和响应体。 实现目标: 1、创建一个HTTP代理服务器。 2、代理所有流量,而对指定的接口(如 /api/target&#…...
计算机网络三张表(ARP表、MAC表、路由表)总结
参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...
Dangerzone:免费的危险的文件转换安全程序
我们知道很多杀毒软件会将很多文件视作恶意程序,尤其是带宏病毒的DOC文件,直接删除难免会带来不必要的麻烦,那么推荐一款免费的危险的文件转换安全程序:Dangerzone 。它可以检查各种可能有危险的文件并将其转换为安全版本…...
2025/1/21 学习Vue的第四天
睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候,普通得定义一个对象与属性。 <!DOCTYPE html> <h…...
【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)
重要信息 会议时间地点:2025年6月13-15日 中国深圳 会议官网:http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台…...
如何使用虚拟现实技术有效提升模拟训练效率
虚拟现实(VR)技术在模拟训练中的应用正逐步展现其巨大的潜力,通过提供高度沉浸式的体验、灵活的训练场景和精准的数据分析,显著提升训练效率。本文将结合Varjo XR-4头显、Techviz多通道显示软件、Senseglove虚拟现实手套等具体案例…...
OpenEuler学习笔记(十一):OpenEuler上搭建LAMP环境
LAMP环境指的是Linux、Apache、MySQL(或MariaDB)和PHP的组合,下面为你介绍在OpenEuler上搭建LAMP环境的详细步骤: 1. 系统更新 首先要更新系统中的软件包,保证系统处于最新状态。 sudo dnf update -y2. 安装Apache…...
Anaconda安装(2024最新版)
安装新的anaconda需要卸载干净上一个版本的anaconda,不然可能会在新版本安装过程或者后续使用过程中出错,完全卸载干净anaconda的方法,可以参考我的博客! 第一步:下载anaconda安装包 官网:Anaconda | The O…...
【玩转全栈】----YOLO8训练自己的模型并应用
继上篇: 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了,接下来我将为大家介绍如何训练自己的特定模型,并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…...
计算机视觉算法实战——无人机检测
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言✨✨ 随着无人机技术的快速发展,无人机在农业、物流、监控等领域的应用越来越广泛。然而,无人机的滥用也带…...
css粘性定位超出指定宽度失效问题
展示效果 解决办法:外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…...
⽤vector数组实现树的存储(孩⼦表示法)c++
在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点,接下来8⾏ÿ…...
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
如果有遗漏,评论区告诉我进行补充 面试官: 主键与索引有什么区别 ? 我回答: 一、主键(Primary Key) 1. 定义 主键是关系型数据库中的一条记录中的某个属性组(可以是一个字段或多个字段的组合),用于唯一标识一条记…...
spring aop 中 返回值
使用环绕切面 Around(value "requsetInterceptor()")public Object logExectionTime(ProceedingJoinPoint joinPoint) throws Throwable {logger.info("-------logExectionTime--------");if(isRun){Object proceed joinPoint.proceed(); // 执行目标方…...
总结7。。
二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅能访问一次(说明不可二次访问,一遍而过)。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。 二叉树常的的遍历方法有…...
9.中断系统、EXTI外部中断
中断系统原理 中断 中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一,所以本节我们就借助外部中断来学习一下中断系统。在以后学习其它外设的时候,也是会经常和中断打交道的。 中断:在主程序运行过程中…...
【软件测试项目实战 】淘宝网:商品购买功能测试
一、用例设计方法分析 在对淘宝网商品下单功能进行测试时,不同的测试角度和场景适合运用不同的用例设计方法,以下是针对该功能各方面测试所适用方法及其原因的分析: 商品数量相关测试:对于商品数量的测试,主要采用等…...
TangoFlux 本地部署实用教程:开启无限音频创意脑洞
一、介绍 TangoFlux是通过流匹配和 Clap-Ranked 首选项优化,实现超快速、忠实的文本到音频生成的模型。 本模型由 Stability AI 提供支持🚀 TangoFlux 可以在单个 A40 GPU 上在 ~3 秒内生成长达 34.1kHz 的立体声音频。 二、部署 安装方式非常简单 1…...
Android多语言开发自动化生成工具
在做 Android 开发的过程中,经常会遇到多语言开发的场景,尤其在车载项目中,多语言开发更为常见。对应多语言开发,通常都是在中文版本的基础上开发其他国家语言,这里我们会拿到中-外语言对照表,这里的工作难…...
Mac cursor设置jdk、Maven版本
基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数,运行cursor,按下ctrlshiftp,输入Open User Settings(JSON),在弹出的下拉菜单中选中下面这样的: 在打开的json编辑器中追加下面的内容: {"…...
Unity中在UI上画线
在UI中画一条曲线 我封装了一个组件,可以实现基本的画线需求. 效果 按住鼠标左键随手一画. 用起来也很简单,将组件挂到空物体上就行了,红色的背景是Panel. 你可以将该组件理解为一个Image,只不过形状更灵活一些罢了,所以它要放在下面的层级(不然可能会被挡住). 代码 可以…...
Unity中关于实现 管道水流+瀑布流动+大肠蠕动效果笔记
Unity中关于实现 管道水流瀑布流动大肠蠕动效果笔记 效果展示: 参考资料及链接: 1、如何在 Unity 中创建水效果 - 水弯曲教程 https://www.youtube.com/watch?v3CcWus6d_B8 关于补充个人技能中:顶点噪波影响网格着色器配合粒子实现水特效 …...
【ARTS】【LeetCode-704】二分查找算法
目录 前言 什么是ARTS? 算法 力扣704题 二分查找 基本思想: 二分查找算法(递归的方式): 经典写法(找单值): 代码分析: 经典写法(找数组即多个返回值) 代码分析 经典题目 题目描述: 官方题解 深入思考 模版一 (相错终止/左闭右闭) 相等返回情形…...
JavaWeb 学习笔记 XML 和 Json 篇 | 020
今日推荐语 愿你遇见好天气,愿你的征途铺满了星星——圣埃克苏佩里 日期 学习内容 打卡编号2025年01月23日JavaWeb笔记 XML 和 Json 篇020 前言 哈喽,我是菜鸟阿康。 以下是我的学习笔记,既做打卡也做分享,希望对你也有所帮助…...
【LeetCode】--- MySQL刷题集合
1.组合两个表(外连接) select p.firstName,p.lastName,a.city,a.state from Person p left join Address a on p.personId a.personId; 以左边表为基准,去连接右边的表。取两表的交集和左表的全集 2.第二高的薪水 (子查询、if…...
【深度解析Java 20天速成】04_IDEA的安装与使用
【Why IDEA ?】 【注】JetBrains官方说明: 尽管我们采取了多种措施确保受访者的代表性,但结果可能会略微偏向 JetBrains 产品的用户,因为这些用户更有可能参加调查。 此外,2022年,某美国软件开发商在对近千名专业的Ja…...
系统思考—业务协同
最近在和一些客户的沟通中,企业老板都提到一个共同的困惑:每个部门都感觉自己在解决问题,做了正确的事情,但为什么组织的绩效就是没有增长?更糟糕的是,大家都不知道问题到底出在哪里? 在这种情…...
windows安装ES
1. 下载ES 访问ES官网下载Download Elasticsearch | Elastic 2. 配置环境变量 ES_JAVA_HOME : D:\jdk-17.0.9 ES_HOME : D:\elasticsearch-8.17.1-windows-x86_64\elasticsearch-8.17.1 3. 添加一些ES的配置 <1>关闭ES安全认证 打开elasticsearch-8.17.1\config\e…...
[java] java基础-字符串篇
目录 API String 创建字符串对象的两种方式: Java的内存模型 字符串常量池(串池)存放地址 两种构造方法的内存分析 String的常用方法 号比较的是什么 字符串比较(比较字符串的数据值) 遍历字符串 StringBui…...
告别手动编辑:如何用Python快速创建Ansible hosts文件?
在自动化运维领域,Ansible是一款非常强大的工具,它可以帮助我们管理和配置大量的服务器。为了让Ansible能够有效地管理这些服务器,我们需要一个hosts清单文件,该文件定义了Ansible要管理的目标主机。在实际应用中,我们…...
神经网络|(二)sigmoid神经元函数
【1】引言 在前序学习进程中,我们已经了解了基本的二元分类器和神经元的构成,文章学习链接为: 神经网络|(一)加权平均法,感知机和神经元-CSDN博客 在此基础上,我们认识到神经元本身在做二元分类,是一种非…...
DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步
题目 请使用互斥锁 和 信号量分别实现5个线程之间的同步 代码:信号量实现 void* task1(void* arg); void* task2(void* arg); void* task3(void* arg); void* task4(void* arg); void* task5(void* arg);sem_t sem[5]; //信号量变量int main(int argc, const …...
Redis 集群模式入门
Redis 集群模式入门 一、简介 Redis 有三种集群模式:主从模式、Sentinel 哨兵模式、cluster 分片模式 主从复制(Master-Slave Replication): 在这种模式下,数据可以从一个 Redis 实例(主节点 Master)复…...
计算机网络 (55)流失存储音频/视频
一、定义与特点 定义:流式存储音频/视频是指经过压缩并存储在服务器上的多媒体文件,客户端可以通过互联网边下载边播放这些文件,也称为音频/视频点播。 特点: 边下载边播放:用户无需等待整个文件下载完成即可开始播放…...
vue + element-ui 组件样式缺失导致没有效果
失效 代码: 修改方法: 在main.js文件里面加上: import element-ui/lib/theme-chalk/index.css; 最后:...