Arduin学习笔记
Arduino整理学习笔记

而当使用write()函数时,Arduino发送的是数值本身。
但是串口监视器接收到数据后,会将数值当做ASCLL码而显示其对应的字符。
总而言之,print是转换成ASCLL码才能发出去,就相当于中间介质。
而write是直接发送数据,不需要中间介质。
#define led1 9#define led2 8char val = '1';void setup() {Serial.begin(9600);pinMode(led1,OUTPUT);pinMode(led2,OUTPUT);}void loop() {if(Serial.available())val = Serial.read();if(val == '9'){digitalWrite(led1,HIGH);delay(1000);}elsedigitalWrite(led1,LOW);if(val == '8'){digitalWrite(led2,HIGH);delay(1000);}elsedigitalWrite(led2,LOW);}蓝牙模块:void setup(){Serial.begin(9600);}void loop(){while(Serial.available()){char c=Serial.read();if(c=='A'){Serial.println("Hello I am amarino");}}}2018.10.30下午建立多个软串口://主机程序#include <SoftwareSerial.h> SoftwareSerialportOne(2, 3); SoftwareSerialportTwo(4, 5);int mark,mark1;void setup(){Serial.begin(9600);while (!Serial){ }portOne.begin(9600);portTwo.begin(9600);}void loop(){//监听1号软串口portOne.listen();if(portOne.available()){Serial.println("Data from port one:"); delay(500); mark=1;}if(mark==1){int inByte1 = portOne.read();delay(2);Serial.println(inByte1);delay(1000);mark=0;}//监听2号软串口portTwo.listen();if(portOne.available()){Serial.println("Data from port two:"); delay(500);mark1=1;}if(mark1==1){int inByte2 = portOne.read();delay(2);Serial.println(inByte2);delay(1000);mark=0;}}//从机程序int i=9;void setup(){Serial.begin(9600);pinMode(13,OUTPUT);}void loop() {Serial.write(i); delay(1000);}。
arduino学习笔记18 - SD卡读写实验

本次实验使用arduino驱动SD卡,在SD卡中进行文件读写。
需要说明的是arduino的SD库文件,目前对2G以上的卡支持不是很好,所以推荐大家使用2G包含2G以下的,文件格式使用FAT格式。
这次我是用的是kingmax2G的MicroSD卡。
先看一下硬件连接图把下面代码下载进arduino 控制板 /*此例子展示如果记录三个模拟引脚数值到SD 卡,使用SD 库。
电路部分* 模拟引脚使用模拟口0,1,2大家可以根据情况接入模拟传感器,如果没有,也可以完成此实验,只不过数值是不停跳动的干扰源。
* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>// CS引脚为pin4,这里也沿用官方默认设置const int chipSelect = 4; //设定CS接口void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not presentSerial.println("Card failed, or not present");return;}Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.}void loop(){// 定义数组String dataString = "";// 读取三个传感器值,写入数组for (int analogPin = 0; analogPin < 3; analogPin++) {int sensor = analogRead(analogPin);dataString += String(sensor);if (analogPin < 2) {dataString += ",";}}// 打开文件,注意在同一时间只能有一个文件被打开// 如果你要打开另一个文件,就需要先关闭前一个File dataFile = SD.open("datalog.txt", FILE_WRITE);// 打开datalog.txt文件,读写状态,位置在文件末尾。
arduino学习笔记

arduino学习笔记12 - ADXL345加速度传感器实验2011-8-19 09:55|发布者: 弘毅|查看: 134|评论: 12|原作者: 弘毅摘要: 本次实验使用arduino用过IIC接口驱动ADXL345加速度传感器,使XYZ 三坐标加速度值显示在1602液晶上,学习ADXL345加速度传感器与IIC接口的基本使用方法。
前两天我们做了温度传感器实验,大家一定还有印象。
今天我们来研究另外一种传感器加速度传感器。
什么是加速度传感器加速度传感器,作用是测量在加速过程中产生的力。
最基本的如咱们平常所熟悉的是重力加速度,大小是1g。
加速度传感器一般用于什么地方通过测量由重力引起的加速度,你可以计算出设备相对于水平面的倾斜角度。
通过分析动态加速度,你可以分析出设备的移动方式。
自平衡车中就是使用加速度传感器与陀螺仪进行卡尔曼滤波进行姿态矫正。
本次试验使用的ADXL345数字传感器,通过I2C或者SPI接口直接输出数字信号。
在1g的加速度下,输出数值为256.下面是硬件连接图下面是代码1.#include <Wire.h> //调用arduino自带的I2C库2.#include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库3.4.#define Register_ID 05.#define Register_2D 0x2D6.#define Register_X0 0x327.#define Register_X1 0x338.#define Register_Y0 0x349.#define Register_Y1 0x3510.#define Register_Z0 0x3611.#define Register_Z1 0x3712.13.LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口14.15.int ADXAddress = 0xA7>>1; //转换为7位地址16.int reading = 0;17.int val = 0;18.int X0,X1,X_out;19.int Y0,Y1,Y_out;20.int Z1,Z0,Z_out;21.double Xg,Yg,Zg;22.23.void setup()24.{25.lcd.begin(16, 2); //初始化LCD26.delay(100);27.Wire.begin(); //初始化I2C28.delay(100);29.Wire.beginTransmission(ADXAddress);30.Wire.send(Register_2D);31.Wire.send(8);32.Wire.endTransmission();33.}34.35.void loop()36.{37.Wire.beginTransmission(ADXAddress);38.Wire.send(Register_X0);39.Wire.send(Register_X1);40.Wire.endTransmission();41.Wire.requestFrom(ADXAddress,2);42.if(Wire.available()<=2);43.{44.X0 = Wire.receive();45.X1 = Wire.receive();46.X1 = X1<<8;47.X_out = X0+X1;48.}49.50.Wire.beginTransmission(ADXAddress);51.Wire.send(Register_Y0);52.Wire.send(Register_Y1);53.Wire.endTransmission();54.Wire.requestFrom(ADXAddress,2);55.if(Wire.available()<=2);56.{57.Y0 = Wire.receive();58.Y1 = Wire.receive();59.Y1 = Y1<<8;60.Y_out = Y0+Y1;61.}62.63.Wire.beginTransmission(ADXAddress);64.Wire.send(Register_Z0);65.Wire.send(Register_Z1);66.Wire.endTransmission();67.Wire.requestFrom(ADXAddress,2);68.if(Wire.available()<=2);69.{70.Z0 = Wire.receive();71.Z1 = Wire.receive();72.Z1 = Z1<<8;73.Z_out = Z0+Z1;74.}75.76.Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
Arduino学习笔记A5 - Arduino常用的代码编写工具

Arduino学习笔记A5 - Arduino常用的代码编写工具Arduino常用的代码编写工具大家在使用Arduino IDE编写程序的时候,都会觉得Arduino的IDE会有很多不足的地方,比如打开缓慢,不能显示中文,高亮不清晰,Auto Format自动格式化工具不够智能等。
下面我分享一下我自己使用的Arduino代码编写工具,或者不一定是最好的,权当抛砖引玉,欢迎大家多提意见。
代码编写器:Notepad2 MOD我先说一下我选代码编写器的要求:1、有语法高亮功能,这是必须的。
2、软件要轻量,界面要简洁,可以一下子打开很多个窗口方便编辑。
好像UltraEdit这样的界面太复杂了,很多时候功能用不到,而vc++又打开极其缓慢,浪费时间。
3、兼容中文注释,其实这个要求不是重点,只是Arduino的IDE竟然不支持,所以才作为要求。
4、可以把语法高亮方案导出为 HTML、UBB 代码,便于论坛或者网站分享。
5、字体清晰可见,必须是等宽字体,中文必须方正,选择时候不能像一些兼容中文的外国软件,因为字体没选好,选择文本时候会选到半个中文字这样。
最后选择了Notepad2 MOD,下载地址:/software/12201.html。
软件不到1M大,速度跟Windows自带记事本差不多。
但是能满足上面四个要求。
但是Notepad2 MOD默认不识别Arduino和Processing的pde格式高亮。
必须要在软件主菜单-工具-自定义语法高亮方案,选“C/C++源代码”加上pde格式即可。
软件可以关联Windows大部分的文本格式,或者添加右键菜单。
并且都有语法高亮显示。
软件放到一个不会移动的位置,设置好上面的“自定义语法高亮方案”后,在软件主菜单-工具-文件关联设置,即可设置所有支持格式的关联。
我一般直接按“全选”就行了,完全可以替代Windows记事本。
代码格式整理:CoolFormat源代码格式化相信大家都用过Arduino IDE的Auto Format功能。
arduino学习笔记.pdf

arduino 学习笔记arduino 学习笔记 1 - 什么是 arduino?要了解arduino就先要了解什么是单片机,arduino平台的基础就是AVR 指令集的单片机。
1、什么是单片机?它与个人计算机有什么不同?一台能够工作的计算机要有这样几个部份构成:中央处理单元CPU (进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。
在个人计算机(PC)上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。
而在单片机中,这些部份全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如模拟量/数字量转换(A/D)和数字量/模拟量转换(D/A)等。
2、单片机有什么用?实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用酷睿处理器吗?应用的关键是看是否够用,是否有很好的性能价格比。
如果一台冰箱都需要用酷睿处理起来进行温度控制,那价格就是天价了。
单片机通常用于工业生产的控制、生活中与程序和控制有关(如:电子琴、冰箱、智能空调等)的场合。
下图就是一个Atmega328P-PU单片机,基于AVR指令集的8位处理器,频率20MHz,存储器空间32KB。
什么是 Arduino?Arduino 是一个能够用来感应和控制现实物理世界的一套工具。
它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序的开发环境组成。
Arduino 可以用来开发交互产品,比如它可以读取大量的开关和传感器信号,并且可以控制各式各样的电灯、电机和其他物理设备。
Arduino 项目可以是单独的,也可以在运行时和你电脑中运行的程序(例如:Flash,Processing,MaxMSP)进行通讯。
Arduino板你可以选择自己去手动组装或是购买已经组装好的;Arduino开源的IDE可以免费下载得到。
Arduino学习笔记(四)--常用函数

Arduino学习笔记(四)--常⽤函数1、pinMode(pin,Mode):设置引脚的输⼊输出状态Pin:引脚号;Mode:INPUT、OUTPUT2、digitalWrite(pin,value) :设置输出引脚的⾼低电平状态Pin:引脚号;value:HIGH LOW3、int digitalRead(pin):读取引脚的状态,并返回HIGH 或LOWPin:引脚号4、int analogRead(pin):读出模拟引脚上的电压,并以⼆进制数值返回(0~1023)对应为0~5vPin:引脚号5、analogWrite(pin,value):给PWM引脚输出电压值pin:引脚号;value:具体的pwm值,(0~255对应表⽰⼀个周期的⾼电平占空⽐)6、shiftOut(dataPin,clockPin,bitOrder,value):将⼀个字节的数据通过移位的⽅式逐位的输出。
dataPin:数据引脚clockPin:时钟引脚bitOrder:移位顺序(MSBFIRST-⾼;LSBFIRST-低)value:需要进⾏移位传输的值说明:在输出数据时,当⼀位数据写⼊数据输出引脚时,时钟引脚将输出脉冲信号,指⽰该位数据已被写⼊数据输出引脚等待外设读取。
并且在使⽤本函数之前datapin和clockpin引脚应该设置为输出状态。
本函数⼀次只能输出⼀个字节的内容,也就是说最⼤⼀次只能输出255,如果⼤于255,就要多次调⽤这个函数。
7、unsigned long mills():回传单⽚机从开始执⾏到现在⽬前的时间(单位:ms)8、delay( number):占⽤单⽚机的时间(单位:ms)number:其代表占⽤单⽚机的时间长度9、delay Microseconds( number):占⽤单⽚机的时间(单位:us)number:其代表占⽤单⽚机的时间10、pulseIn(pin,state,timeout):读取脉冲宽度。
arduino函数学习笔记

Arduino程序的主函数main在内部就已经定义了,所以只需void setup()和void loop().前者用于初始化在程序开头设置引脚的输入输出模式,初始化串口,执行一次。
loop是死循环,是执行程序。
函数pinMode()有两个参数pin和mode, pin参数表示所要配置的引脚,mode 表示设置的模式INPUT或OUTPUT. arduino板上的模拟引脚亦可作数字引脚用,A0~A5对应数字14~19digitalWrite()两个参数,pin表示设置的引脚(须设置为OUTPUT模式),value 表示输出的电压HIGH或LOW,此函数作用是设置引脚输出的电压为高或低。
digitalRead()一个参数,pin***(须设置为INPUT模式),用来获取引脚的电压情况HIGH或LOW. 若引脚没有连接到任何地方,那么随机返回高或低。
analogReference(type)analogRead(pin) 用于读取引脚的模拟电压值,返回值int 范围0~1023,pin 只能是6模拟接口。
analogWrite(pin,value)在指定引脚上输出一个模拟量,应用在LED灯亮度控制,电机转速控制。
无返回值。
Value表示PWM输出的占空比。
范围0~255 shiftOut(dataPin,clockPin,bitOrder,val)无返回值能够将数据通过串行的方式在引脚上输出shiftIn(datapin,clockPin,bitOrder)通过串行的方式在引脚上读入数据。
pulseIn(pin,state,timeout) 此函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或LOW。
如果是HIGH,函数先将引脚变为高电平,在开始计时,一直到变为低电平为止,返回脉冲持续时间长短,单位MS,如果超时还未读到,将返回0. 函数返回值为unsigned long ,3个参数分别表示脉冲输入的引脚,脉冲响应的状态(高或低)和超时时间。
Arduino学习笔记② Arduino语言基础

1.前言在初步认识什么是Arduino之后,我们就开始讲解一下Arduino语言基础,我们需要知道到底Arduino提供了什么平台以及什么语言来让我们做开发(技术基本上都是先学习开发语言)。
2.Arduino语言以及程序结构Arduino使用C/C语言编写程序(绝大部分的程序员大学都学了这个)。
C语言是一种面向过程的编程语言,C是一种面向对象的编程语言(虽然楼主已经忘光了这个)。
早期Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新核心库采用C与C++混合编程。
通常所说的Arduino语言,就是指Arduino核心库提供的各种API的集合。
这些API是对更底层的单片机支持库进行二次封装所形成的(玩过单片机的人估计都是经常和各种寄存器打交道)。
Arduino提供的API可以让初学者不用理会单片机复杂寄存器配置,然后就能直观控制Arduino,提高开发效率。
Arduino程序的基本结构如下:void setup() {// put your setup code here, to run once(这里代码只运行一次):}void loop() {// put your main code here, to run repeatedly(这里代码不断运行):}这个模型可以这样理解(估计学过c语言的都知道main):int main() {setup() ;while(1) {loop() ;}}3.语言基础对于学过C语言的人,可以直接大概扫描一下。
3.1 数据类型3.1.1 常量程序运行中,值不能改变,常量可以是字符,也可以是数字,语句:#define 常量名常量值例子:一般人都要用到调试功能(这里我个人是用串口),但是在真正最终代码的时候又想关闭调试功能,那么就可以这么用:#define MyDebugSerial Serial//该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息#define DEBUG#ifdef DEBUG#define DBGLN(message) MyDebugSerial.println(message)#else#define DBGLN(message)#endifvoid setup() {MyDebugSerial.begin(9600);DBGLN("setup end");}void loop() {}3.1.2 变量程序中可变的值称为变量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Arduin学习笔记void setup{}函数初始化void loop{}函数循环pinMode(13,OUTPUT/INPUT)引脚13定义为输出、入模式digitalWrite(13,HIGH/LOW)13引脚输出高、低电平delay()延迟函数analogRead() 读取模拟量函数analogWrite()写入模拟量函数map()函数Serial.begin(波特率值)串口通信函数Serial.print()是输出你要的内容横排显示Serial.println()是输出要显示的内容后自动换行Arduino参考手册Arduino开发语言提供全部的C语言特性和C++语言的部分特性.通过链接到AVR的libc库online~,可以使用库中提供的函数.具体的应用细节请参考相关文档.程序结构在Arduino中, 标准的程序入口main函数在内部被定义,用户只需要关心以下两个函数:void setup()void loop()setup()函数用于初始化, loop()函数用于执行. 初始化函数一般放在程序开头, 用于设置一些引脚的输出/输入模式, 初始化串口通讯等类似工作. loop()函数中的代码将被循环执行, 例如: 读入引脚状态,设置引脚输出状态等.控制语句ifif...elseforswitchwhiledo...whilebreakcontinuereturngoto相关语法;(分号){}(大括号)// (单行注释)/* * /(多行注释)#define#include算术运算符= (赋值)+ (加)- (减)* (乘)/ (除)% (取模)比较运算符== (等于)!= (不等于)< (小于)> (大于)<=(小于等于) >= (大于等于)布尔运算符&& (逻辑与) || (逻辑或) ! (逻辑非)指针运算符* 指针运算符& 地址运算符位运算& (位与)| (位或)^ (位异或)~ (位非)<< (左移) >> (右移)端口操作复合运算符++ (自加)-- (自减)+= (复合加) -= (复合减) *= (复合乘) /= (复合除) &= (复合与) |= (复合或)变量常量HIGH|LOWINPUT|OUTPUTtrue|false整数常量浮点数常量数据类型void(无类型)boolean(布尔型)char(字符型)unsigned char(无符号字符型) byte(字节型)int(整型)unsigned int(无符号整型) long(长整型)unsigned long(符号长整型) float(单精度)double(双精度)string(字符串)array(数组)数据类型转换char()byte()int()word()long()float()变量作用域&修饰符变量作用域static (静态变量)volatile (易变变量)const (不可改变变量)辅助工具sizeof() (sizeof运算符) ASCII码表基本函数数字I/OpinMode(pin, mode) digitalWrite(pin, value) digitalRead(pin)模拟I/OanalogReference(type)analogRead(pin)analogWrite(pin, value)- PWM高级I/OshiftOut(dataPin, clockPin, bitOrder, val) pulseIn(pin, state, timeout)时间millis()delay(ms)delayMicroseconds(us)数学库min(x, y)max(x, y)abs(x)constrain(x, a, b)map(x, in_min, in_max, out_min, out_max) pow(base, exponent)sqrt(x)三角函数sin(rad)cos(rad)tan(rad)随机数randomSeed(seed)random(howbig)random(howsmall, howbig)位操作lowByte()highByte()bitRead()bitWrite()bitSet()bitClear()bit()设置中断函数attachInterrupt(interrupt, function, mode) detachInterrupt(interrupt)开关中断interrupts()noInterrupts()串口通讯Serial.begin(speed)Serial.available()Serial.read()Serial.flush()Serial.print(data)Serial.println(data)扩展库如果要使用一些已有的库, 可以选择菜"Sketch->Import Library", 然后选择相应的库. Sketch工具会自己在代码的开头包含库的头文件(#include). 在引入库之后, 程序的体积也将会因为包含了库的代码).对于不是必要的库, 直接删除对应的#include语句就可以了.官方扩展库以下是Arduino官方提供的扩展库, 被默认包含在开发工具中.EEPROM- 读写EEPROM存储区.Ethernet- 以太网支持.Firmata- 基于串口的通讯协议LiquidCrystal- LCD液晶显示Servo- 伺服电机.1.1点亮LEDint led=13........................................定义LED引脚位13引脚Void setup(){pinMode(led,OUTPUT);..........引脚13定义为输出模式(INTOUP输入)}Void loop(){digitalWrite(led,HIGH);..............写出的信号 13引脚高电平Delay(1000);.................................延迟1000毫秒=1秒 digitalWrite(led, LOW); // led引脚变为低电平delay(1000); // 延时1秒}1.2不使用延时函数的led闪烁程序这里闪烁led没有使用延时函数,使用了定时器的内容,阿德罗已经封装成了库,我们使用更简单// 定义引脚const int ledPin = 13; // led连接的引脚,标准的uno开发板上已经// 变量int ledState = LOW; // led状态,亮或者灭,可以修改long previousMillis = 0; // 存储最后一次的led状态// 这里使用了长整型变量,因为使用了ms,瞬间的数值变化非常大。
long interval = 1000; // 间隔闪烁的时间长度void setup(){// 初始化引脚输出模式pinMode(ledPin, OUTPUT);}void loop(){// 这里可以添加其他的程序unsigned long currentMillis = millis();if(currentMillis - previousMillis > interval){// 保存当前值,方便下次再次和当前时间比较previousMillis = currentMillis;// 如果led熄灭就把它点亮,反之亦然if (ledState == LOW)ledState = HIGH;elseledState = LOW;// 把对应的LED状态反应到led引脚上。
// 之前都是用变量再处理,处理完成后把最终结果输出到终端。
digitalWrite(ledPin, ledState);}}1.3简易流水灯// 引脚定义const int ledCount = 8; // led个数int ledPins[] = { 0,1,2, 3, 4, 5, 6, 7, }; // 对应的led引脚void setup(){// 循环设置,把对应的led都设置成输出for (int thisLed = 0; thisLed < ledCount; thisLed++)pinMode(ledPins[thisLed], OUTPUT);}}void loop(){// 熄灭所有led,不同的电路连接也会得到点亮所有ledfor (int num = 0; num < 8; num++){digitalWrite(ledPins[num], HIGH);}// 循环顺序点亮led然后等待200ms后熄灭for (int num = 0; num < 8; num++){digitalWrite(ledPins[num], LOW);delay(200);digitalWrite(ledPins[num], HIGH);// 这样就形成了简易的led流水效果}}2.1 利用A0输入的模拟量,控制led点亮状态,可以直观看到电压大小引脚定义Const int analogPin= A0;........模拟输入Const int ledCount = 8;........led个数Int ledPins[] = {0,1,2,3,4,5,6,7, }.....对应引脚Void setup(){For (int thisLed = 0;thisLed < ledCount;thisLed++).....循环设置,把对应的led设置成输出{pinMpde(ledPins[rhisLed],OUTPUT);}}Void loop(){int sensorReading = analogRead(analogPin);.......读取电位器的值 Int ledLevel = map(sensorReading ,0,1023,0,ledCount);.....吧对应的值转换成0-8}// 循环对比输出到led:for (int thisLed = 0; thisLed < ledCount; thisLed++) {if (thisLed < ledLevel) {digitalWrite(ledPins[thisLed], HIGH);}else {digitalWrite(ledPins[thisLed], LOW);}}}3.0读取端口端电平信号并输出到串口段/* 读取Pin2的电平信号,并把结果打印到串口,也同时反映到LED灯*/// 定义引脚int pushButton = 2;int led = 13;// 初始化void setup() {// 初始化串口Serial.begin(9600);// 把按键引脚设置为输入// 德飞莱增强版有高电平和低电平触发的2个按键,都可以使用,直接接KEY_H或者KEY_LpinMode(pushButton, INPUT); // 独立模块LY-51S开发板上独立按键K1-K8都可以使用。