不知不觉,开始学习实践快到一个星期了,感觉收获颇多,一个星期学到了以前在学校要学很久的东西,视野也得到了很大的提升。而且把我们以前不知道需要做什么的语言现实化,可以看到自己成果的感觉非常好。
回顾这一周我学习了arduino的基础编程以及c++的知识,最主要是环境数据采集项目的实现夯实基础,学习环境数据采集系统的控制以及各种传感器的控制和功能的实现。
在arduino上,我学到了arduino基础的语法和编程风格,在原有的基础上认识对arduino进行了更加系统的学习,了解了c语言编程和arduino编程的区别。其中,最重要的是了解了arduino各种独特的指令,arduino给我么提供了很多功能非常强大的函数,只有掌握了用法就可以非常灵活地调用,用简单的语句写出功能强大的程序。
arduino的程序最基本特点就是它有两个不同于其他程序的特点,
基本格式:
void setup() { //这里面是设置,目的是设置一些串口或者其他程序的一些状态,比如说设置串口的输入输出模式,引脚的输入输出
//这里setup只执行一次,在arduino控制器开始运行的时候就运行
}
void loop() {
//这里是无限死循环得到部分,也是程序的主体,主要程序就写在这里。
//在这里面的程序会不停顺序向下循环运行
}
arduino编程和普通的语言编程最大的区别就是在于和硬件的结合,要将编程面向硬件功能的实现。这个星期我了解到了arduino的各种控制器和模块,在导师的帮助下也真实的接触到了各种控制器和模块,也知道了可以利用这些控制器和模块可以实现那些功能,比如微型卫星,3D打印机,飞行器等等都可以用arduino加上各种模块和硬件来实现。
我将主要用到的控制器为arduino UNO控制器,这款控制器的功能很强大,可以利用这一个控制器加上各种模块实现日常生活中所见的血多功能,也是一种开源的控制器,开发非常灵活,非常适合我的学习。arduino上有许许多多的控制端口,这些端口的使用非常灵活,只需要简单的定义后就可以用作不同的功能实现。最基本的就是I/O端口功能,这些端口可以用来接受模拟信号和数字信号,也可以用来发送模拟信号和电子信号,更可以用作串口信号和电脑间实现相互的数据传输,可以从电脑接受指令数据,也可以向电脑发送各种模块采集到的数据,可以实现个体和控制器及模块的互动。
再说说我所接触到得各种模块,有各种感应模块,比如说温湿度、红外、声音等等感应器;也有各种传输模块比如GSM信号传输模块、蓝牙模块等等;还有各种控制模块,传统的有电继器,开关等;也有各种动力设备,比如舵机等等。在这个星期里,我也已经基本掌握各种模块的控制函数以及控制方法,也进行了实验程序的编写,最令人激动的是这些程序在我自己搭建各种电路下实现各种模块的控制与功能的实现,这种学习方法让我真正地感受到了编程的乐趣所在。
这里就是我练习的套件:
套件里面有各种电阻电容、led灯,控制器、面包板、舵机、按键开关、电继器、温度感应器、杜邦线等等
下面是我练习的一小部分代码:
练习试验----------------------------------------------华丽分割线-----------------------------------------------------/*这是一个基础的程序,目的是让灯亮一秒然后熄灭一秒,无限循环下去,也是arduino的“hello world”*/ int led = 13; //设置13号引脚别名led // the setup routine runs once when you press reset: void setup() { pinMode(led, OUTPUT); //设置13号引脚led为输出模式,可输出高电平 } // 下面loop会无限死循环,实现灯不断闪的效果 void loop() { digitalWrite(led, HIGH); //点亮lcd灯 delay(1000); // 等待一秒 digitalWrite(led, LOW); // 熄灭led灯 delay(1000); // 等待一秒 }----------------------------------
电继器控制Led灯, 可以通过电继器控制电压大小来调节灯光的亮度
int pin1 = A0; //设置pin1为接受信号端口 int pin = 3; //设置pin3为主控信号输出端口
void setup()
{
}
void loop()
{
led = analogRead(A0); //读取输入端口输入的信号
analogWrite( 3, map(led, 0, 1023, 0, 255)); //将接收到得信号模拟成0-5v的电压进行输出,控制LED灯的亮度
delay(200);
}---------------------------------
接下来试试串口通信控制Led灯的熄灭和开启,可以在电脑端通过串口向控制器发送指令
/*
*/ void setup()
{
Serial.begin(9600); //设置串口通信频率为9600
pinMode(13, OUTPUT); //13号引脚和8号引脚为输出模式
pinMode(8, OUTPUT);
}
void loop()
{
char a = Serial.read(); // 读取串口发送而来的字符数据并用char a变量来存储
if(a >= 'a' && a <= 'z') //如果发送来的字符为a~z的字母的话就点亮13号引脚连接的led灯
{
digitalWrite( 13, HIGH);
delay(500);
digitalWrite(13, LOW);
}
if(a >= '0' && a <= '9') //数字则点亮8号脚的led灯
{
digitalWrite(8, HIGH);
delay(500);
digitalWrite(8, LOW);
}
}
---------------------------下面来个高级一点的,用开关来控制舵机,然后用led灯来做指示灯。
预期的效果是按下左边或者右边的开关,然后舵机就向左或者右转,按下一下指示绿灯便点亮提示一下表示为正常工作状态。
如果舵机到达左边或者右边的极限不能再继续转下去,便点亮红灯做警示
#include<Servo mypin>;int button_right = 3; //右边的按键开关引脚int button_left = 5; //左边的按键开关int led = 13; int green = 8; //13号灯和8号灯,可以将两个灯设为不同颜色
int angle = 100; //初始化后舵机处于的角度,也用这个变量来记录角度的变化
void setup()
{
pinMode(button_right, INPUT_PULLUP); //右键引脚为输出模式
pinMode(button_left, INPUT_PULLUP);
mypin.attach(A3); pinMode( led, OUTPUT); //设置led灯的引脚
pinMode(green, OUTPUT);
}
void loop()
{
// boolean right_val = false;
//boolean left_val = false;
while( digitalRead(button_right) == 1 && digitalRead(button_left) == 1 )//当按下左键或者右键开关时就点亮左边或者右边的led灯{
digitalWrite(green, HIGH);delay(20);digitalWrite(green, LOW);
}
if( digitalRead(button_right) == 0) //按下右键开关,就朝着右边转动{
angle += 20; //即将转动的角度为20度if(angle>=0 && angle < 180) // 控制舵机转动的角度在舵机工作的0~180度之内
{
mypin.write(angle); //转动舵机delay(20);}
else
{
digitalWrite(led, HIGH); // 点亮红灯做警示delay(200);digitalWrite(led, LOW);angle -= 20;
}}
if(digitalRead(button_left) == 0) //舵机向左转动
{
angle -= 20; //每次转动20度if(angle > 0 && angle <= 180)
{
mypin.write(angle);delay(20);}
else{
digitalWrite(led, HIGH);delay(200);digitalWrite(led, LOW);angle += 20;}
}
delay(200); }richermen