精华内容
下载资源
问答
  • 大家好,我是帅地。 双非校招拿大厂提前批 offer 在校期间从 0 到 1 摸索出个 10 万垂直粉丝公众号 毕业半年依靠工作与副业挣到人生第个 100 万 ...看过我之前文章的读者可能都知道,我大一第学期不是计算

    大家好,我是帅地。

    双非校招拿大厂提前批 offer

    在校期间从 0 到 1 摸索出一个 10 万垂直粉丝公众号

    毕业半年依靠工作与副业挣到人生第一个 100 万

    回过头来,帅地已经毕业一年多了,下面跟大家扯一扯我普普通通的四年大学吧

    大一

    大一第一学期这部分的事情最多了,所以会写的多一些,因为我觉得,在大一,我的思维发生了很大的改变,大一过后,我的想法、计划就基本有着落了,后面基本事按照自己的计划,去做自己喜欢的事了。

    大一第一学期的第一要务:转专业

    看过我之前文章的读者可能都知道,我大一第一学期不是计算机专业的,读的专业是木材科学与工程。当然,这不是我自己选择的专业,而是高考分数不够,被调剂的专业,我自己热爱的专业是计算机类专业,还没有进入大学之前,我就说我一定要读编程相关的专业了。

    说实话,我很庆幸自己最后转到了计算机类的专业,一个很现实的原因就是,学编程,真的能够挣钱,而且你愿意努力学的话,你一毕业就能够拿到很高的工资,本科毕业,有好些可以拿到年薪 50 万,你敢信?就算工资很低,也都能年薪十几万,当然,我不能暴露自己的工资,暴露了就要被公司劝退了。

    是的,我读计算机专业,有两个重要的原因,一个原因就是热爱,一个是家里穷,我想挣钱,改变家里的现状。

    所以在我大一第一学期那一会,我的目标就很明确,这学期的任务就是转专业,所以我了解了转专业的各种规则,了解到转专业的一个最基本的要求就是数学和英语需要 85 分以上才能参与考试。

    85 分很难吗?不难;但是如果需要你保证 85 分难吗?说实话,有一些,因为万一考不好呢?考不好就得大二转了,所以我第一学期,英语的平时分,我给刷到了 100 分,也就是满分。数学是我的强项,但我依然不敢掉以轻心,在考前把 2006-2015 年的试卷都刷了一两遍。

    有这样的准备,数学和英语的分数那必须杠杠,实不相瞒,大一学期的绩点是我整个大学的巅峰,然而,三等奖依然没有拿到!!!因为我只学了这两门,其他随意,不挂科即可。

    当然,85 分只是一个门槛,转专业的竞争还是挺激烈。我选了软件工程,参与人数大概是差不多 60 人,不过学院只接 15 个人(后来好像是录取了 20 人),所以为了稳一些,我在第一学期就把 c 语言自学了一遍,把学校的 OJ 题库,第一学期相关的编程题,给刷了一两遍。

    说实话,有了这样的准备,转专业想不成功都难,考试 2 小时,我不到半个小时就离开考场了,等待录取通知了。

    有必要加入社团吗?

    对于刚步入大学的同学来说,社团是一个比较有趣的玩意,绝大部分人都会去加入自己喜欢的社团吧。

    我进入大学之前,很多人说,在大学,要多交点人脉,多认识一些朋友,因为这些人会成为你后面很重要的资源,所以我去加入一些社团,其实是想多认识一些人。

    然而,我去面试了两个社团,都在二面被刷了,说实话,对于面试,我还是有点恐惧的,反正就是挺紧张,后来我就干脆不去面试了,不加入社团了。

    后来我就加入了他们的会员,之前面试那个,是成为他们的干部。成为会员则不需要面试,不过需要交会员费用,所以我就顺便成为了几个社团的会员,例如羽毛球,爱心社团啥的。

    不过,我去参与了一两次社团的活动之后,就没在去了,一个简单的原因就是,我不大喜欢,我还是喜欢去做自己喜欢的事。我是一个懒散,喜欢自由,不喜欢被束缚的人,所以我觉得,我还是不去参加这些活动了。

    回答刚才的问题,有必要加入社团吗?,可能很多人会觉得,必须要加入社团,不然大学就不完整了,我的想法则是,加入社团不是一个必选项,加与不加,我觉得都没事,看你自己的喜欢。

    加入社团能学到很多东西吗?能学到一些,但这些没啥的,对于以后找工作,我觉得属于可有可无。如果你自己愿意学习,学习能力比较强,在哪里都可以学到很多东西。

    摆脱的社团之后,我基本就什么组织也没参加了,然后我宿舍也有一个和我一样比较逗比+沙雕的,我俩就经常去外面溜达,看到有趣的活动,就去参与一波,反正完全看心情,报名了活动,交了钱,心情不好就不去参加了,美滋滋(感觉要被喷,哈哈)

    有必要多认识些人吗?

    我刚才说了,我希望自己在大学多认识些人,多泛交些朋友,后来经过第一学期的感悟,我发现,这没必要,在大学,大家基本都在忙各自的事情,我本来还想在大学找几个挚友,以后一起干大事,但经过一学期的观察,发现这很难,当然,很难不代表不存在。

    总之,对于现在还在大一大二的学生,如果你有这方面的疑问,那么我给的建议是,没必要刻意去交朋友,其实后面大家都各自去做自己的事情了,毕竟找到一些经的起时间考验的志同道合的朋友,很不容易。

    第二学期:落差之后的折腾

    大一学期其实可以写的还有非常非常多,因为第一学期,我的任务就两门课程,还是非常闲,期间也发生了非常多改变我想法多事情,不过一不小心就两千多字了,还是不继续写了,后面的时光可能就没有第一学期那么丰富了,相对比较枯燥了。

    经过了第一学期,成功进入了软件工程,自己也没参与什么社团,并且大学想要干点事,例如创业之类的,因为没读大学之前,经常听说创业这事……总之,进入大学的时候,感觉前途一片光明,我觉得我要干非常非常多的事,但进入大学之后,发现并没有啥战绩。

    庆幸的事,我完成了一个非常坚定的目标,那便是转专业。转过来软工之后,我也想干点大事,例如 acm 拿个牛逼的奖牌,或者写个牛逼的软件出来,因为经常听到某某人开发了一个 xx,然后就成名了。

    然而,学了 c 语言,发现啥也写不出来,学了算法,发现 acm 那些题也太难了,一道题做一天,还是没做出来,答案也看不懂,发现自己并不是大神,脑子也并没有大佬转的快。

    后来,我就不打算参加 acm 了,感觉如果自己要拿到名次,肯定会花很多时间,并且不一定拿的到,加上我看到班里也有人退出 acm 集训队了,这更加坚定了我的想法。

    听说数据结构与算法很重要,所以我早早就把数据结构与算法这门课学完了,我第二学期学的最多的就是数据结构 + 算法这两门课,虽然不参加 ACM,但算法还是得学,会点算法听说会显的牛逼一些。

    暑假的折腾

    大一暑假那会,虽然数据结构与算法学的还不错,不过发现啥东西的做不出来,C 语言写的程序都是黑乎乎的界面,然后我就学了 windows 程序编程,这样我就可以写个程序给身边的人玩了,毕竟我是学编程的,至少得写个作品出来给别人玩啊。

    在暑假花了十几天,把那本 900 多页的windows程序编程刷了 700 多页,写了个计算器,后来发现身边的人还是玩不了,因为很多人没电脑,于是我就对 windows 编程没兴趣了,想着写个程序能够在手机运行就好了,于是花了十几天学了 android 编程,刷完了《第一行代码》这本书,顺便入门了 Java,跟着书写了个天气预报,还是挺开心。

    不过我又改变主意了,想着要是能挣到钱就更好了,于是我发现把 app 上传到商店,然后植入广告,就可以挣钱了,于是我买了一些实战类 android 项目的书籍,写了几个 app,自己改版之后传到了应用商店。

    然而,没啥人下载,于是我又放弃搞安卓了,后来想写个网站,然后放一些资源,让别人来下载好像也有机会挣钱,于是我学习了 HTML,CSS,JavaScript,然后又不了了之……

    这两个月的暑假,我感觉自己搞了好多东西,好多都是半途放弃,实不相瞒,驱动我去折腾这些事有两个原因:挣钱 + 装逼

    说实话,我做什么事情,都需要驱动力,我觉得驱动力对我来说太重要了,这个驱动力可以很虚,但必须得有,而我又是一个俗人,能够挣钱,是我最大的驱动力。

    当初我玩斗地主,驱动力是挣 Q 币,后来我发现这些 Q 币好像不能充 QQ会 员还是怎么的,我就放弃不玩了。

    这段折腾,我觉得让我慢慢摸清了自己的方向,所以在这里,对于大一或者大二的同学,如果你们有自己感兴趣的,或许可以去尝试一波。

    别人可能会说,这搞一下,那搞一下,会导致样样都会,但样样不精。而我的想法是:完全可以去尝试,大学的学习,不存在精通这一说法,大一大二多尝试,大三确定自己的方向来学习完全来得及。

    大二

    经过大一的洗礼,我觉得我的目标相对比较明确了,该玩的玩了,该折腾的折腾了,现在得好好规划下自己的未来了。我了解到校招时大厂非常看重基础,于是我大二就一直在学习基础,例如计算机网络,算法,操作系统这些,怎么学?

    得有动力啊,于是我报名了中级软考,这算是我一个动力,这门考试会考整个大学涉及到的知识,于是为了搞定这个软考,我大二把很多课程都学了,后面软考也顺利通过了。

    中级软考有必要参加吗?答是随便,这个证没啥含金量的,我的目的是让他督促我学习基础知识,适合用来复习知识吧。

    如果自己能坚持学,其实我是不建议浪费时间去考

    总之,大一,我学了很多数据结构和算法相关知识,大二,我学了很多基础知识 + Java 的知识,并且大二比较专心,啥比赛,啥活动也没参加,我说了,我喜欢做自己喜欢做的事,喜欢跟着自己的步伐走,别人的建议,我可能会参考下,但我无论做什么事,都有自己的想法和思考。

    有人也有问,有必要加入实验室吗?,我没加过实验室,但我想说的是,加与不加,都没关系,重点是你想学习什么,想成为什么样的人,实验室,更多的是一种气氛,但不一定适合你。要是我加入实验室,我可能会把实验室当作一个学习的场地,进而去学习自己喜欢的东西。

    也有人问,那些基础知识很枯燥,有没有什么办法?,答是没有,有些本来就枯燥,但枯燥的东西,往往是决定你我之间的区别,如果都很有趣,那大家肯定也都学,正是因为困难,所以才有了人与人之间的区别。

    大三

    2018 年我大三了,大三的我,可能是大一大二学了太多东西了,大三我可以说是慢慢开辟了一条新的赛道,并且新赛道也和我之前大一大二学所的知识相辅相成,那就走上了写作这条路,从此开启了自己开挂的人生。

    我写的文章有多受欢迎?

    在 CSDN 仅发 100 多篇文章,便收获几百万阅读量。

    image-20210923183023512

    更有单篇阅读量近百万的文章,2019 年底 ~ 2020 年那会可以说是 CSDN 的大红人。

    image-20210924115215075

    知乎也完美收获了万赞文章,而且还是动态规划这样有难度的算法

    image-20210924115427957

    很幸运的是,不仅在写作上取得了很好的成就,在秋招上,也是早早就在提前批拿到了腾讯的 offer,可以说刚读准大四,我就结束了自己的秋招了。

    image-20210923183525854

    作为一名双非,没有任何实习经历,任何比赛经历的本科生,之所以能够拿到大公司的 offer,是因为我很早就知道大公司喜欢考什么,自己应该学什么,有自己的一套面试方法。

    而学历不好的人,意识早,真的非常重要,不然就是毕业 = 失业。

    9月份当别人还在埋头准备秋招的时候,我已经告别的秋招去探索新的方向了。

    2020.6 我毕业了,并且赶在毕业前自己送给了自己一份礼物:一个刚好 10 万粉丝的微信公众号。

    2020 年底当别人在准备年终答辩的时候,我已经挣到了人生第一个一百万了:毕业半年,帅地人生的第一个一百万

    如今的我,已经毕业一年多了,虽然说在技术上不是多厉害,但在面试、校招,大学职业规划,写作,副业上,比绝大部分人都要优秀。

    所以在这两年中,我回复了别人无数次问题,应该也影响了好多好多人,每当校招季都会很多人来报喜,我也很开心,帮助别人,真的可以让自己很有成就感

    image-20210924122859883

    不过我的微信好友太多了,每天各种问题咨询我,然而很多的问题,都是类似的,大部分是自己没好好学习,迷茫之类的,帅地也没有那么多的精力去一一答复大家,很多情况都是很简短回答一下。

    所以呢,帅地创建了一个专注于校招|大学生成长|专治各种迷茫的知识星球

    在这个星球里,我会非常详细回答大家的问题,并且这些问题可以沉淀下来,帅地也会分享面试、校招,大学职业规划,写作,副业这方面的内容等等。

    作为过来人一路折腾过来,相信一定可以给你带来很多参考价值。

    要么不做,要么就尽最大的努力去做好,所以呢,假如你是要参加校招的大学生,非科班等等,绝对非常适合你,有帅地在前面带路,一定可以让你少走很多弯路。

    帅地会在知识星球提供如下服务

    一、咨询服务:沉淀答疑,少走弯路

    这两年帅地回答了很多问题,例如 offer 选择,学习规划,大部分人都是迷茫的,不知道自己该干啥。

    而且,大部分都是类似的问题,帅地精力有限,无法一一回复,而如今有了知识星球,那些具有代表性的问题都可以沉淀下来,相信可以帮助大家少走一些弯路。

    而这个星期最大的好处就是,你可以在星球问帅地任何问题,职业选择,简历修改,校招,面试,可以定制化咨询问题,和我一对一提问,这是你在其它地方找不到的,帅地会非常详细回答你们,例如

    image-20210923184938534

    随着问题的积累,会沉淀的越来越多,大家有什么疑问,都可以搜到到,这样可以更好着帮助大家往相对「正确」的方向去学习一些东西。

    二、提供各类学习资料 + 完整的学习攻略

    为了让大家物所超值,这个星球会提供各类学习资源,例如优质的项目,视频教程,书籍等等。

    目前 Java项目,前端优质项目已提供,球友专属,后续C++,Python等项目也会陆续提供,随便一个项目,去购买都得上百元了

    image-20210922141250057

    这些项目有没有用,看看球友的答复就知道了,基本每个项目都是精心筛选,而不是那些培训班的项目,太臃肿了。

    并且帅地会提供完整的学习攻略,那些未来目标是想要找工作的,跟着我提供的学习攻略一步一个脚印走就行了

    三、帅地每周分享

    帅地每周不定时都会分享一些心得感悟,这些基本都是自己摸索出来的一些经验,说不定,就有某一篇分享影响了你的一生

    image-20210924125954702

    四、简历修改

    简历面试指导,而且是一对一,对症下药,部门球友通过我的指导,我告诉他应该如何回答,之后立马拿了几个offer。

    image-20210922142117164

    简历是面试的第一道门槛,如果你学历很牛逼,拿过很多奖牌,随便怎么写都行,但是你普普通通,那么一份简洁的简历,就显的非常重要了。

    五、CSDN 下载服务

    如果需要csdn下载自己又没有积分的,可以直接把链接甩到我微信,我看到会给你下载

    image-20210922142822000

    六、副业指导

    如果你想做副业,帅地也会把我的各种副业运营经验告诉你,在副业,运营引流这方面,经常被人称为布道师。 帅地会不定时分享自己的副业运营经验,基本有问必答,都是帅地实打实的心得干货。

    七、每逢节日发红包

    不说了,我应该是最发红包最勤奋的博主了,基本每逢节日都会发红包,有帅地,不孤单

    image-20210922142356684

    七、星球成为你的最强后盾

    在星球里的同学,基本都是热爱学习的小伙伴,在这样的环境下,相信你也会慢慢变的优秀起来,从我读书到工作,我深刻明白身边环境的重要性,在这个星球,你会收获很多小伙伴。

    目前已经有 450 + 的小伙伴在星球里了

    image-20210923185402358

    如果你信得过帅地,那么帅地邀请你加入,这个星球,将会成为你坚强的后盾。

    由于维护星球需要花费很大的精力 + 过滤一部分,该星球是付费的,价格是 119元。

    前 200 名加入,可以领取下方优惠卷****20 元,支付 99 元加入,这可能会成为你人生的关键!

    image-20210922143447973

    99 元,一顿饭的钱,可能,这将会改变你的一身也不一定。

    别的不敢保证,星球的资料 + 简历修改 + 量身定制的回答,早就超过 99 元的价格了,总之,物所超值,帅地也期待你的加入

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyzUJMeD-1632640639809)(https://gitee.com/iamshuaidi/picture/raw/master/picture/%E6%B5%B7%E6%8A%A5%20(1)].png)

    展开全文
  • 然后别人会说,都奔三了,结婚了没有啊,难道你会在回句,我连女朋友都没有……过。真是悲催呀!额……又扯远了。好了,为了避免尴尬,别人问你多大的时候,你可以跟他说,我已经七千多了,哈哈哈。那么这个换算...

    当我们回想往事时会不会感叹时间流逝,往事如烟,暮然回首,物是人非……

    额……不扯了,现在进入主题,当别人问你多大的时候,你总是会说:我22了!然后别人会说,都奔三了,结婚了没有啊,难道你会在回一句,我连女朋友都没有……过。真是悲催呀!额……又扯远了。

    好了,为了避免尴尬,别人问你多大的时候,你可以跟他说,我已经七千多天了,哈哈哈。那么这个换算是如何进行的呢?

    接下来我来告诉你:

    #include<iostream>
    using namespace std;
    
    class Date
    {
    public:
        Date(int year = 1990, int month = 1, int day = 1)
            :_year(year)
            , _month(month)
            , _day(day)
        {
            //如果日期规格不正确,那么定义一个日期
            if (!(_year > 0 && _month > 0 && _month<13
                && _day>0 && _day < GetMonthDays(_year, _month)))
            {
                _year = 1990;
                _month = 1;
                _day = 1;
            }
        }
    
        Date(const Date&d)
            :_year(d._year)
            , _month(d._month)
            , _day(d._day)
        {}
    
        Date& operator=(const Date&d)
        {
            if (this != &d)
            {
                _year = d._year;
                _month = d._month; 
                _day = d._day;
            }
            return *this;
        }
    
        //日期加上天数,返回日期
        Date operator+(const int days)
        {
            if (days<0)//如果天数为负数,直接转为减法
            {
                return (*this) - (0 - days);
            }
    
            Date temp(*this);//定义一个临时变量,
            temp._day += days;//将天数加到临时变量的天上面
    
            int _daysinmonth = 0;
            while (temp._day>(_daysinmonth=GetMonthDays(temp._year, temp._month)))
            {
                temp._day -= _daysinmonth;
                if (12 == temp._month)//如果当前月份为12,那么年加1,月置于1
                {
                    temp._year += 1;
                    temp._month = 1;
                }
                else
                {
                    temp._month += 1;
                }
            }
            return temp;//处理完成之后,返回这个日期
        }
    
        //日期减去天数,返回日期
        Date operator-(const int days)
        {
            if (days < 0)//如果天数是负数,直接转为加法
            {
                return (*this) + days;
            }
    
            Date temp(*this);
            temp._day -= days;
    
            while (temp._day < 0)
            {
                if (1 == temp._day)//如果当前月份为1月,那么年减1,月份置于12
                {
                    temp._year -= 1;
                    temp._month = 12;
                }
                else
                {
                    temp._month -= 1;
                }
    
                temp._day += GetMonthDays(temp._year, temp._month);
            }
            return temp;
        }
    
        //日期之间的减法,返回相差的天数
        int operator-(const Date& d)
        {
            Date _mindate(*this);
            Date _maxdate(d);
    
            if (_mindate > _maxdate)
            {
                _mindate = _maxdate;
                _maxdate = *this;
            }
    
            int count = 0;
            while (_mindate < _maxdate)
            {
                ++_mindate;//让小的日期加1的同时将计数器加1
                ++count;
            }
            return count;
        }
    
        Date&operator++()
        {
            *this = *this+1;
            return *this;
        }
    
        Date&operator++(int)
        {
            Date temp = *this;
            *this = *this + 1;
            return temp;
        }
    
        Date&operator--()
        {
            *this = *this - 1;
            return *this;
        }
    
        Date&operator--(int)
        {
            Date temp = *this;
            *this = *this - 1;
            return temp;
        }
    
        bool operator>(const Date& d)
        {
            if (_year > d._year ||
                (_year == d._year && _month > d._month) ||
                (_year == d._year && _month == d._month && _day > d._day))
            {
                return true;
            }
            return false;
        }
    
        bool operator==(const Date& d)
        {
            if (_year == d._year && _month == d._month && _day == d._day)
            {
                return true;
            }
            return false;
        }
    
        bool operator<(const Date& d)
        {
            return !(*this>d || *this == d);
        }
    
        bool operator!=(const Date& d)
        {
            return !(*this == d);
        }
    
    private:
        //获得每月的天数
        int GetMonthDays(int year,int month)
        {
            int DaysInMonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
            if (IsLeap(year) && month == 2)
            {
                DaysInMonth[month] += 1;
            }
            return DaysInMonth[month];
        }
    
        //判断是不是瑞年
        bool IsLeap(int year)
        {
            if (((0 == year % 4) && (0 != year % 100)) || (0 == year % 400))
            {
                return true;
            }
            return false;
        }
    
        //重载输出操作符
        friend ostream& operator << (ostream&_cout, const Date&d)
        {
            _cout << d._year << "-" << d._month << "-" << d._day;
            return _cout;
        }
    
    private:
        int _year;
        int _month;
        int _day;
    };
    
    int main()
    {
        //Date d;
        //Date d1(2017, 3, 22);
        //Date d2(2017, 2, 30);
    
        Date d3(1995, 7, 11);
        cout << d3 + 10000<< endl;//我的第一万天是多少
    
        cout << d3 - 100 << endl;//出生前百天日期
    
        Date d4(2017, 3, 23);
        cout << d4 - d3 << endl;//我活了多少天
    
        return 0;
    }

    一万天也是一个具有有重要意义的日子,快来计算你的一万天吧!

    展开全文
  • 一个屌丝程序猿的人生(一百一十)

    千次阅读 热门讨论 2020-05-24 00:32:35
    看到这个短信号码的备注是李丹,林萧足足愣神了十几秒,嘴里还不由得自言自语道:“她... 这些消息自然是林萧的母亲韩霞告诉他的,毕竟两人的母亲是非常好的闺蜜,当初林萧猛知道这个消息的时候,心中还不由得有些波

      看到这个短信号码的备注是李丹,林萧足足愣神了十几秒,嘴里还不由得自言自语道:“她怎么突然想起找我来了?”

      关于李丹人也在北京这件事,林萧是一直都知道的,当初李丹在工地上和程海伦跑了以后,或许是因为工地生活的无聊和辛苦,让李丹体会到了生活的不易,而李丹本身也是会计专业的,所以李丹努力的拿到了注册会计师证,随后因为老家工作环境受限,便来到了北京务工,和程海伦开始了异地恋的生活。

      这些消息自然是林萧的母亲韩霞告诉他的,毕竟两人的母亲是非常好的闺蜜,当初林萧猛一知道这个消息的时候,心中还不由得有些波动,不过后面随着学习和工作的节奏逐渐加快,再加上和欧阳晓之间的事,林萧便渐渐把李丹在北京这件事给遗忘了。

      如今突然收到李丹的消息,让林萧再次意识到,李丹其实一直就在距离自己10公里左右的通州,坐地铁可能还用不了半个小时就到了。

      想到这,林萧琢磨着明天是周末,自己也没什么事,于是便带着一丝好奇回消息道:“我明天没事,你要去哪逛?”

      回完消息之后,林萧便把手机扔到床上,去洗手间洗漱去了。

      等林萧回来的时候,李丹已经回了消息,里面的内容是:“你不是买了个iPhone嘛,我想你明天陪我去看看手机,我也想买一个。”

      看到这个消息内容,林萧总算知道了李丹为什么要找自己逛街。

      于是林萧几乎是不假思索的回了句,“行,那我们明天在传媒大学地铁站见面吧,然后一起去西单逛一逛。”

      回完消息之后,林萧一时间觉得有些索然无味,如果李丹还是单身的话,或许林萧还会有些小小的兴奋,毕竟欧阳晓远在郑州,而且似乎还和前男友不清不楚的,这让林萧早就失望至极,甚至觉得两人已经不能算是恋人关系。

      这种情况之下,如果能和李丹重续前缘的话,倒也算是一桩美事。

      退一步讲,哪怕两人关系无法再进一步,只要两个人都是单身,也远远好过陪别人的女朋友逛街。

      只是林萧注定只能是奢望了,李丹和程海伦的关系,那可是大人们都知道的事情,两人的恋爱关系,那可是千真万确的事。

      不过林萧也不得不承认,如今的他,周末一个人在家确实是无聊至极,哪怕是陪别人的女朋友逛街,他也只能是认了,不管怎么说,总好过自己一个人在家闷着。

      ......

      就这样,第二天早上10点的时候,李丹坐着地铁,和林萧在传媒大学地铁站见了面。

      自上次一别之后,两人已经有差不多整整两年没见面了,如今在北京相遇,两人开始的时候都有点拘谨。

      今天的李丹穿着一身粉红色的连衣长裙,加上精致的五官和高挑的身材,显得十分的青春靓丽,光彩动人。而相比之下,林萧则显得朴素多了,标准的程序员格子衫外加一条休闲裤,活脱脱的就是一个宅男屌丝。

      这样一对组合出现在地铁上,自然得到了不少人的注目礼,这让两人在路上更加的沉默。

      好不容易下了地铁,两人都不由得松了口气,随后两人对视一眼,都忍不住笑了。

      这一刻,林萧觉得自己心里,似乎有什么东西放下了。

      看着眼前川流不息的人群,体会着自己此刻的心情,林萧忽然觉得,或许两人自始至终都不太适合做恋人,而是更加适合做朋友。毕竟两人从小就认识,互相之间都知根知底,失去了男女之间应该有的那种神秘感,因此就很难产生恋人之间的那种情愫。

      如果不是李丹外貌不错,而林萧当初上学时又比较突出,恐怕两人之间,压根就不会有任何这方面的想法,那或许只是单纯的对美好事物的向往罢了。

      想通了这一点之后,后面逛街的时候,两人之间已经不再像开始那么拘谨。

      一路上,两人互相开对方的玩笑,一起在路边啃鸡排,一起和店员讨价还价,哪怕一个几千块钱的手机,最后只是还掉了50块钱,两人事后也都是心满意足的互相看着对方傻乐,这种感觉让林萧一度觉得,仿佛两人再次回到了小时候相处的那些时光,简单而又快乐。

      而在北京这个容易让人觉得孤单的城市里,这种简单的快乐,就更显得弥足珍贵。

      ......

      手机买完之后,两人在西单又逛了一个多小时,这才拖着有些疲惫的身体,踏上了回去的地铁。

      本来两人计划是在传媒大学地铁站分开的,不过在途中林萧从李丹口中得知,两人一个共同的朋友陈可刚好在传媒大学上学,于是两人临时决定,下午一起去传媒大学找陈可吃个饭再分开。

      林萧的出租屋离传媒大学地铁站比较近,于是两人便先一起来到了林萧的出租屋,准备休息一会儿,再一起过去找陈可。

      陈可的年纪和林萧差不多,陈可的母亲和林萧的母亲也是熟识,只不过相对而言,林萧的母亲和李丹的母亲关系更紧密一些,因此林萧和陈可见面的次数不多,但也算是比较熟悉。

      林萧也没有想到,陈可一直就在离自己不远的传媒大学上学,不过林萧对于陈可那是一点想法也没有,陈可的性格,活脱脱就是一个女汉子,只能让人把她当兄弟,很难有什么其它的想法。

      来到林萧的出租屋后,因为林萧的房间也没什么地方坐,两人只能都坐在床上,一边休息一边聊天。

      当然,最重要的,肯定是一起摸索下李丹新买的iPhone手机,毕竟花了那么多钱,总得好好的验验货。

      原本两人孤单寡女共处一室,又正值青年,难免会心生异样,但经过了之前的事以后,两人的关系似乎变得纯粹了许多,这也让两人这段单独相处的时间当中,气氛不会显得那么尴尬。

      如此到了约莫下午6点左右的时候,两人便一起来到了传媒大学,一到门口,林萧就看到了穿着一身牛仔衣的陈可,就站在传媒大学的门口,正在朝着二人招手。

      “嘿!林萧,李丹,我在这呢。”

      三人见面之后,自然是少不了一番寒暄,随后三人便在附近找了个饭馆吃饭。

      吃饭途中,话题中出现次数最多的,就是程海伦这个名字。陈可的母亲和李丹的母亲也认识,因此李丹和程海伦的事情,陈可自然是不难知道。

      如今陈可马上就要毕业,正是对未来充满期待的时期,知道李丹的事情后,自然是八卦之心熊熊燃烧,一边了解着李丹和程海伦的事,一边对自己的未来憧憬着。

      林萧看着陈可那一脸痴迷的表情,几乎可以确定,陈可恐怕也在幻想着,未来能有一个开着跑车的白马王子,来拯救自己与水火之中。

      这也让林萧不禁感叹,看来女汉子也终归是女生,都有着爱做公主梦的潜质。

      就这样,三人的饭局,就在陈可无限的羡慕和感叹当中度过了,事后,李丹坐上地铁前往通州,陈可则是步行回学校,而林萧,自然是一个人步行回到了出租屋。

      当天晚上,林萧躺在床上,有种从梦境回到现实的感觉,他也再次意识到,自己的生活当中,其实没有李丹,有的只是工作的忙碌,还有和欧阳晓的争吵。

     

    -------分割线-------

     

           每次上来看到催更,真的是又高兴又发愁。/捂脸

           这本小说,最终一定会写完的,一定!       

    展开全文
  • 【Arduino】一天入门Arduino语言 教程

    万次阅读 多人点赞 2020-04-05 10:19:19
    一天入门Arduino语言 教程 为什么要写这个文章 为了让有一定编程基础和开发经验的同学能够快速的上手 Arduino 同时Arduino 新手也可以借此巩固下知识 如果你有过类似 51 STM32 NXP 等开发经验,根据本篇文章,可以...

    一天入门Arduino语言 教程

    为什么要写这个文章

    为了让有一定编程基础和开发经验的同学能够快速的上手 Arduino 同时Arduino 新手也可以借此巩固下知识

    如果你有过类似 51 STM32 NXP 等开发经验,根据本篇文章,可以快速的了解并上手Arduino
    ,同时对于Arduino新手而言,可以有一个系统的学习。

    可结合IDE介绍博客一起学习,更好的掌握Arduino
    Arduino IDE使用教程-超详细

    Arduino语言

    Arduino使用C/C++编写程序,虽然C++兼容C语言,但这是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。早期的Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编写而成。

    通常我们说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称API)的集合。这些API是对更底层的单片机支持库进行二次封装所形成的。例如,使用AVR单片机的Arduino的核心库是对AVR-Libc(基于GCC的AVR支持库)的二次封装。

    传统开发方式中,你需要厘清每个寄存器的意义及之间的关系,然后通过配置多个寄存器来达到目的。

    而在Arduino中,使用了清楚明了的API替代繁杂的寄存器配置过程,这点在下方的代码中你将深有体会,这也是Arduino能成为简单入门单片机的核心。

    C语言基础部分

    判断语句:

    if

    if语句是最常用的选择结构实现方式,当给定表达式为真时,就会运行if内的语句

    if(表达式)
    {
    语句;
    }
    

    if…else

    若这个表示式为真,语句1部分的代码就会被执行。若这个表示式为假,则执行紧接着else之后的语句2部分代码。

    	
    if(表达式)
    {
    语句1;
    }
    else
    {
    语句2;
    }
    

    if…else if

    若这个表示式1为真,语句1部分的代码就会被执行。若这个表示式1为假,则紧接着判断else if之后的表达式2,如果表达式2为真,则执行语句2 ,否则依次往下循环。

    一旦 else if 成功,将不会测试剩余的else if或else语句。

    	
    if(表达式1)
    {
    语句1;
    }
    else  if(表达式2)
    {
    语句2;
    }
    else  if(表达式3)
    {
    语句3;
    }
    else  if(表达式4)
    {
    语句4;
    }
    ……
    

    switch…case

    类似于if语句, switch … case 通过允许程序员指定应在各种条件下执行的不同代码来控制程序的流程。 switch 语句将变量的值与 case 语句中指定的值进行比较。当发现一个case语句的值与变量的值匹配时,运行case语句中的代码。如果所有的case都不符合switch的表达式 则执行default语句中的代码。

    比起一串冗长的if叙述,使用swith case可使程序代码看起来比较简洁。

    switch(表达式)
    {
    case 常量表达式1:
           语句1
           break;
    case 常量表达式2:
           语句2
           break;
    default// 以上条件都不符合时,预设执行的动作
           语句n
           break;
    }
    
    • Switch后的表达式结果只能是整形或字符型

    • switch语句使用 break 关键字退出,通常在每个case语句的结尾使用。如果没有break语句,switch语句将继续执行后续的表达式(“fall-through”),直到到达break语句或达到switch语句的结尾。

    循环语句:

    while循环

    当while之后的条件成立时,执行括号内的程序代码。

    while循环将会连续、无限循环,直到括号()内的表达式变为false。或者使用break语句跳出循环,否则while就是死循环。

    while(表达式)
    {
    	语句;
    }
    

    do…while循环

    和while 相似,不同的是while前的那段程序代码会先被执行一次,才会判断特定的条件式为真或为假。如果为真则继续执行,如果为假则跳出循环。因此若有一段程序代码至少需要被执行一次,就可以使用do…while架构。

    do
    {
    	语句;
    }
    while(表达式);
    

    for循环

    假如您需要运行代码多次,且每次使用不同的值,那么for循环则非常适用

    for (循环变量类型 循环变量名称;循环条件;更新语句)

    for(循环变量名称;循环条件;更新语句)
    {
    	语句;
    }
    

    每次循环完一次都会执行更新语句 只要还满足循环条件就会一直进行循环

    for (i=0; i<5; i++) { 
    
    }
    

    就是初始化i=0 当i小于5时运行循环体中的语句,每循环完一次,i自加1,总共循环5次

    break语句

    当 break 关键字用于 while、for循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。

        while(1){  //循环条件为死循环
            sum+=i;
            i++;
            if(i>100) break;
       }
    

    while 循环条件为 1,是一个死循环。当执行到第100次循环的时候,计算完i++;后 i 的值为 101,此时 if 语句的条件 i> 100 成立,执行break;语句,结束循环。

    一个 break 语句只向外跳一层

    continue语句

    continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。

    i=0;
    b=0;
    if(i<10)
    {
    
    i++;
    	if(i<5)
    		b++;
    	else
    		continue;
    }
    
    

    上方代码就会在i小于5的时候执行b++ 在i大于5的时候执行continue语句 继续循环 最后i=10,b=5

    语法符号

    • ; 语句分隔符
    • {} 代码块
    • // 单行注释
    • /* 在这个范围内你可以写一整首诗 */ 多行注释

    */*/**之间的内容,及 // 之后的内容均为程序注释,使用它可以更好的管理代码。注释不会被编译到程序中,不影响程序的运行。

    // 这是一个单行注释
    
    /*
     
    这是一个多行注释
      
    注释内容1
    注释内容2  
    ……
      
    */
    

    运算符:

    常见C\C++运算符

    在这里插入图片描述
    Arduuino复合运算符

    *+= , -= , = , /=

    对一个变量和另一个参数或变量完成一个数学运算。+=(以及其他)可以缩短语法长度。

    Syntax语法

    x += y; // 等价于 x = x + y;

    x -= y; // 等价于 x = x - y;

    x *= y; // 等价于 x = x * y;

    x /= y; // 等价于 x = x / y;

    Parameters参数

    x:任何变量类型

    y:任何变量类型或常数

    Examples范例

    x = 2;

    x += 4; // x现在为6

    x -= 3; // x现在为3

    x *= 10; // x现在为30

    x /= 2; // x现在为15

    Syntax语法

    x++; // increment x by one and returns the old value of x

    // 将x的值加1并返回原来的x的值。 ++x; // increment x by one and returns the new value of x // 将x的值加1并返回现在的x的值。

    x-- ; // decrement x by one and returns the old value of x // 将x的值减1并返回原来的x的值。

    –x ; // decrement x by one and returns the new value of x // 将x的值减1并返回现在的x的值。

    Parameters参数

    x: an integer or long (possibly unsigned)

    x:一个整数或长整数(可以无符号)

    Returns返回

    The original or newly incremented / decremented value of the variable.

    返回变量原始值或增加/消耗后的新值。

    Examples范例:

    x = 2;

    y = ++x; // x now contains 3, y contains 3 // x现在为3,y为3

    y = x–; // x contains 2 again, y still contains 3 // x现在仍然为2,y将为3

    数据类型:

    整型:

    类型取值范围说明
    int–2,147,483,648 ~ 2,147,483,647整型
    unsigned int0 ~ 4,294,967,295无符号整型
    long–2,147,483,648 ~ 2,147,483,647长整型
    unsigned long0 ~ 4,294,967,295无符号长整型
    short–32,768 ~ 32,767短整型

    boolean 布尔类型

    布尔类型的值只能为真(true)或是假(false)

    boolean会占用1个字节的内存空间。

    byte 字节类型

    储存的数值范围为0到255。如同字符一样字节型态的变量只需要用一个字节(8位)的内存空间储存。

    浮点型

    浮点数也就是常说的小数。在Arduino中有floatdouble两种浮点类型,

    float类型占用4个字节(32位)内存空间,

    double类型占用8个字节(64位)内存空间。可表达最大值为 1.7976931348623157 x 10308

    float最多有8位小数

    double最多有16位小数

    float 和double 都不能为0

    字符型

    char

    用于存储字符数据 单一字符例如 A 占用一个字节内存空间,存储字符时,字符需要用单引号引用

    Arduino使用ASCII 码来存储字符数据 用数字表示一个字符时,它的值有效范围为 -128 到127。

    char Str='A';
    

    String

    char只能表示一个字符,如果需要多个字符的话,就需要用到String

    它是由多个ASCII字符组成 可以用来保存多个字符

    如:

    String   Str = "Helloo,World";
    

    相较于数组形式的定义方法,使用String类型定义字符串会占用更多的存储空间。

    数组:

    数组是由一组相同数据类型的数据构成的集合。数组概念的引入,使得在处理多个相同类型的数据时,程序更加清晰和简洁。

    其定义方式如下:

    类型说明符 数组名[常量表达式];
    

    例如:

    int a[5];
    

    它表示定义了一个整型数组,数组名为 a,定义的数组称为数组 a

    此时数组 a 中有 5 个元素,每个元素都是 int 型变量,而且它们在内存中的地址是连续分配的。也就是说,int 型变量占 4 字节的内存空间,那么 5 个int型变量就占 20 字节的内存空间,而且它们的地址是连续分配的。

    数组中的下标是从 0 开始的,例如“int a[5];”表示定义了有 5 个元素的数组 a,这 5 个元素分别为 a[0]、a[1]、a[2]、a[3]、a[4]。

    初始化:

    在定义时初始化

    int a[5] = {1, 2, 3, 4, 5};
    
    int a[5];
      
    a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
    

    要将A[4]的值除以2并将结果赋值给变量x,我们将写:

    x = A[ 4 ] / 2;
    

    数据类型转换:

    • char()

    • byte()

    • int()

    • long()

    • float()

    也就是类型强制转换 比方说将一个char字符类型强制转化为int整数类型

    char str = 'a';
    int  sch =  int(str);   //将字符a 转换为整数 按照ASCII码 a的ASCII码数值是97
    

    注意,由高精度想低精度转换,会出现bug 比如把int类型转换为byte类型,就会出现数据缺失的情况 (int最大2,147,483,647 byte最大255)

    常量和变量:

    常量:在Arduino语言中事先定义了一些具特殊用途的保留字。 其值不能改变

    可以用const关键字来定义常量

    const 类型 常量名 = 常量值
    

    还可以用宏定义来定义常量

    #define 宏名 值
    

    例如:

    const int a =0;
    #define b = 1;
    

    那么在该程序种,a就只能是0 b就只能是1

    变量:变量可以用来储存各种类型数据,并且可以更改数据

    其定义方法如下

    类型 变量名;
    

    例如,定义一个整型变量i:

    int i=95;
    

    Arduino使用的C语言中的变量具有名为scope(范围)的属性。scope是程序的一个区域,有三个地方可以声明变量。它们是:

    • 在函数或代码块内部,称为局部变量
    • 在函数参数的定义中,称为形式参数
    • 在所有函数之外,称为全局变量

    局部变量

    在函数或代码块中声明的变量是局部变量。局部变量只能在其函数内使用

    Void loop () {
       int x , y ;
    
       x = 0;
       y = 0; 
    
    }
    
    y = 2;  //这样就是错的
    

    形式参数

    作为函数的参数来使用,用来传递其他变量的值

    void Led(int a){
    
    a = 0;
    
    }
    int b=2;
    Led(b);  //把b的值传递给形参a
    

    全局变量

    全局变量在所有函数之外定义,通常位于程序的顶部。全局变量将在程序的整个生命周期中保持其价值。

    全局变量可以被任何函数访问。也就是说,一个全局变量可以在整个程序中声明后使用。

    int y = 0;  //全局变量
    
    Void loop () {
       int x;
    
       x = 0;
       y = 1;    //这样是对的
    
    }
    
    y = 2;  //这样是对的
    

    在Arduino中定义了许多常量,是不可修改的,也是我们常用的

    常量PI

    Arduino核心库中已定义的常数PI,

    #define PI 3.1415926535897932384626433832795
    

    HIGH | LOW

    表示数字IO口的电平,HIGH 表示高电平(1),LOW 表示低电平(0)。 HIGH 和LOW 也用来表示你开启或是关闭了一个Arduino的脚位(pin)

    INPUT | OUTPUT

    表示数字IO口的方向,INPUT 表示输入(高阻态),OUTPUT 表示输出(AVR能提供5V电压 40mA电流)

    true | false

    true 表示真(1),false表示假(0)。

    Arduino 语言部分

    此部分我们来探讨Arduino的语言特性,让你来真正的掌握Arduino

    Arduino结构

    Arduino程序中没有main函数。

    main函数的定义隐藏在了Arduino的核心库文件中,所以Arduino开发一般不直接操作main函数,而是使用Setup和loop这个两个函数。

    **Arduino软件结构包括两个主要函数:

    • Setup()函数 初始化变量,管脚模式,调用库函数等

    • Loop()函数 连续循环执行loop函数内的程序

    void setup()
    {
      // 在这里加入你的setup代码,它只会运行一次:
    }
     
    void loop() 
    {
      // 在这里加入你的loop代码,它会不断重复运行:
    }
    
    Void setup ( ) {
    
    }
    

    在程序开始时使用,Arduino控制器通电或复位后,,程序启动时会调用 **setup()**函数。使用它来初始化变量,引脚模式,启用库等。setup函数只能在Arduino板的每次上电或复位后运行一次。

    Void loop ( ) {
    
    }
    

    在setup()函数之后,即初始化之后,loop() 让你的程序循环地被执行。使用它来运转Arduino。连续执行函数内的语句,这部份的程式会一直重复的被执行,直到Arduino 板子被关闭。

    Arduino I/O函数

    数字 I/O

    pinMode()函数

    pinMode(13,OUTPUT);  //定义引脚的模式
    

    数字IO口输入输出模式定义函数,将接口定义为输入或输出接口

    pinMode()函数用于将特定引脚配置为输入或输出。可以使用INPUT_PULLUP模式启用内部上拉电阻。此外,INPUT模式显式禁止内部上拉。

    • pin - 你希望设置模式的引脚的编号 0~13
    • *mode* - INPUT(输入模式),OUTPUT(输出模式)或INPUT_PULLUP(内部上拉输入)。

    范例:

     pinMode(7,INPUT); // 将脚位 7 设定为输入模式
    
     pinMode(1,INPUT);//将脚位1设定为输入模式
    
     pinMode(2,INPUT);//将脚位2设定为输入模式
    
     pinMode(3,INPUT);//将脚位3设定为输入模式
    

    引脚配置为INPUT

    Arduino引脚默认配置为输入 ,输入模式下,由外部器件向Arduino对于引脚输入电平,和数据,Arduino识别电平及数据,进行相应的处理。

    引脚配置为OUTPUT

    引脚配置为输出模式,Arduino引脚向其他电路提供大量的电流。Arduino引脚可以向其他器件/电路提供(提供正电流)或吸收(提供负电流)高达40mA(毫安)的电流。这是足以点亮LED或者运行许多传感器的电流(不要忘记串联电阻),但不足以运行继电器,螺线管或电机。

    上拉电阻

    在这里插入图片描述

    上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用,增强输出引脚的驱动能力,提高芯片输入信号的噪声容限,增强抗干扰能力。

    也就是默认状态下io为高电平 ,下拉电阻与此同理。

    digitalWrite()函数

    digitalWrite(pin,value);  //定义引脚的电平
    
    • pin你希望设置模式的引脚的编号 0~13
    • value表示为HIGH(高电平)或LOW(低电平)

    HIGH为5V(或3.3V在3.3V板上),LOW为0V(接地)

    数字IO口输出电平定义函数,将数字接口值至高或低、开或关,即digitalWrite(接口名称, HIGH或LOW)。但脚位必须先透过pinMode明示为输入或输出模式digitalWrite才能生效。比如定义HIGH可以驱动LED。

    范例:

    digitalWrite(8,HIGH); //将脚位 8设定输出高电位
    

    digitalRead函数

    引脚电平读取函数

    int digitalRead(pin)
    

    数字IO口读输入电平函数,读出数字接口的值 比如可以读数字传感器。当感测到脚位处于高电位时时回传HIGH,否则回传LOW。

    范例:

    val = digitalRead(7; // 读出脚位 7 的值并指定给 val
    

    模拟 I/O

    analogRead()函数

     int analogRead(pin)
    
    • pin 要读取的模拟输入引脚的编号(Arduino Diecimila为0~5,Arduino nano为0~7 Mega上为0至15)

    模拟IO口读函数,从指定的模拟接口读取值,Arduino对该模拟值进行10-bit的数字转换。 此函数返回0到1023之间的数字,表示0到5伏特之间的电压。例如,如果施加到编号0的引脚的电压为2.5V,则analogRead(0)返回512。

    通过使用**analogRead()**函数,我们可以读取施加到其中一个引脚的电压。比如可以读模拟传感器(10位AD,0~5V表示为0~1023)。

    范例:

    val = analogRead(2; //读出类比脚位 2 的值并赋值给 val
    

    analogWrite函数

    analogWrite(pin, value);
    

    数字IO口PWM输出函数,给一个接口写入模拟值(PWM波)改变PWM脚位的输出电压值可用于电机PWM调速或音乐播放。

    • pin:对于 ATmega168芯片的Arduino(包括Mini或BT),该函数可以工作于 3, 5, 6, 9, 10和 11号接口

    • value表示为0~255

    例如:输出电压2.5伏特(V),该值大约是128。

    范例

     analogWrite(9128; // 输出电压约2.5伏特(V)
    

    扩展 I/O

    shiftOut函数

    shiftOut(dataPin, clockPin, bitOrder, value)
    

    SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,把资料传给用来延伸数位输出的暂存器,此函式通常使用在延伸数位的输出。函式使用一个脚位表示资料、一个脚位表示时脉。dataPin为数据口,clockPin为时钟口,bitOrder用来表示位元间移动的方式,为数据传输方向(MSBFIRST高位在前,LSBFIRST低位在前),value会以byte形式输出,表示所要传送的数据(0~255),另外还需要一个IO口做74HC595的使能控制。

    范例

     shiftOut(dataPin, clockPin, LSBFIRST, 255);
    

    pulseIn()函数

    unsigned long pulseIn(pin, value)
    

    脉冲长度记录函数,设定读取脚位状态的持续时间,返回时间参数(us),例如使用红外线、加速度感测器测得某一项数值时,在时间单位内不会改变状态。pin表示为0~13,value为HIGH或LOW。比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间。

    范例:

    time = pulsein(7,HIGH); // 设定脚位7的状态在时间单位内保持为HIGH
    

    Arduino 时间函数

    Arduino提供四种不同的时间操作函数

    delay(ms) 延时函数

    delay (ms) ;
    

    delay(ms) 延时函数(单位ms),延时一段时间,暂停晶片执行多少毫秒,

    delay(1000)为一秒。

    范例

    //LED闪烁实验
    void loop() {
       digitalWrite(ledPin, HIGH); // 打开LED灯
       delay(1000); // 延时1秒钟
       digitalWrite(ledPin, LOW); // 关闭LED灯
       delay(1000); // 延时1秒钟
    }
    

    delayMicroseconds()函数

    delayMicroseconds (us) ;
    
    • us 是要暂停的微秒数(无符号整型)。

    延时函数(单位us)暂停晶片执行多少微秒

    delayMicroseconds()函数接受单个整数(或数字)参数。此数字表示时间,以微秒为单位。一毫秒内有一千微秒,一秒内有一百万微秒

    目前,可以产生精确延迟的最大值是16383

    范例:

    delayMicroseconds(1000; //暂停1豪秒
    

    millis()函数

    unsigned long millis()
    

    返回时间函数(单位ms), 回传晶片开始执行到目前的毫秒,此函数用于返回Arduino板开始运行当前程序时的毫秒数,该参数溢出大概需要50天时间。

    范例

    void loop() { 
       Serial.print("Time:");  //延时1S计算运行时间
       time = millis();  
       delay(1000); 
    }
    

    micros()函数

    micros () ;
    

    micros()函数返回Arduino板开始运行当前程序时的微秒数。该数字在大约70分钟后溢出,即回到零。在16 MHz Arduino板(例如Duemilanove和Nano)上,此函数的分辨率为4微秒(即返回值总是4的倍数)。在8 MHz Arduino板(例如LilyPad)上,此函数的分辨率为8微秒。

    范例:

    void loop() { 
       Serial.print("Time:");  //延时1S计算运行时间
       time = micros();  
       delay(1000); 
    }
    

    Arduino数学函数

    Arduino数学库(math.h)包含了许多用于操作浮点数的有用的数学函数。

    min(x, y)

    求最小值 ,回传两数之间较小者

    范例

    val = min(1020; // val=10
    

    max(x, y)

    求最大值 ,回传两数之间较大者

    范例

     val = max(1020; // val=20
    

    abs(x)

    计算绝对值 ,回传该数的绝对值,

    范例

     val = abs(-5; // val=5
    

    constrain(x, a, b)

    约束函数,下限a,上限b,判断x变数位于a与b之间的状态。

    x若小于a回传a;

    介于a与b之间回传x本身;

    大于b回传b

    范例

     val = constrain(i, 0255; // 将i的值赋值给val 并且i的取值为0~255
    

    map(value, fromLow, fromHigh, toLow, toHigh)

    约束函数,value必须在fromLow与toLow之间和fromHigh与toHigh之间。将value变数依照fromLow与fromHigh范围,对等转换至toLow与toHigh范围。时常使用于读取类比讯号,转换至程式所需要的范围值。

    范例

    val = map(analogRead(0),01023100200; // 将analog0 所读取到的讯号0~1023对等转换至100,200之间的数值。
    

    pow(base, exponent)

    开方函数,base的exponent次方。回传一个数(base)的指数(exponent)值。

    范例

     double x = pow(y, 32; // 设定x为y的32次方
    

    sq(x) 平方

    平方函数,返回x的平方值

    范例:

    val=sq(2);  //val等于2的平方
    

    sqrt(x) 开根号

    回传double型态的取平方根值。

    范例:

    double val = sqrt(1138; // 回传1138平方根的近似值 33.73425674438
    

    double log (double __x)

    log()函数返回参数x的自然对数。

    范例:

    double val = log(2);
    

    double round (double __x)

    round()函数将x四舍五入到最近的整数,但中间情况不舍入到0(不是到最近的偶数整数)。不可能会溢出。

    范例:

    double val = round(5.6); //val=6
    

    Arduino三角函数

    Arduino提供了传统的三角函数(sin,cos,tan,asin,acos,atan)

    double sin(double x); //返回x弧度的正弦
    double cos(double y); //返回y弧度的余弦
    double tan(double x); //返回x弧度的正切
    double acos(double x); //返回A,对应于cos(A)=x的角度
    double asin(double x); //返回A,与sin(A)=x相对应的角度
    double atan(double x); //返回A,与tan(A)=x相对应的角度
    

    范例:

    double sine = sin(2; // 近似值 0.90929737091
    double cosine = cos(2; //近似值-0.41614685058
    double tangent = tan(2; //近似值-2.18503975868
    

    Arduino 随机数函数

    randomSeed()函数

    randomSeed(seed)
    

    随机数端口定义函数,seed表示读模拟口analogRead(pin)函数

    randomSeed(seed)函数重置Arduino的伪随机数生成器

    虽然random()返回的数字的分布本质上是随机的,但是顺序是可预测的。所以如果需要一个真正的乱数,可以呼叫此函式重新设定产生乱数种子。你可以使用乱数当作乱数的种子,以确保数字以随机的方式出现,通常会使用类比输入当作乱数种子,藉此可以产生与环境有关的乱数(例如:无线电波、宇宙雷射线、电话和萤光灯发出的电磁波等)。

    范例:

    randomSeed(analogRead(5)); //使用来自模拟管脚5的噪声随机化
    

    random()函数

    long random(min, max) 
    

    随机数函数,返回数据大于等于min,小于max。

    long random(max) 
    

    返回数据大于等于0,小于max。

    范例:

    long randnum = random(11; // 回传 0 -10之间的数字
    long randnum = random(0100; // 回传0 – 99 之间的数字
    

    Arduino外部中断函数

    中断:**

    中断(interrupt)停止Arduino的当前工作,以便可以完成一些其他工作。

    什么是中断:

    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
    待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。

    通俗点说:你正在家里做家务,突然有人来找你,打断了你的进程,在你们交谈完之后,你就又回去继续进行你的家务活,这其中被打断的过程,就叫做中断,而在中断结束之后,你则会继续进行本来应该做的事情

    • 中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。
    • 中断可以来自各种来源。在这种情况下,我们使用的是由数字引脚上的状态改变触发的硬件中断
    • 大多数Arduino设计有两个硬件中断(称为“interrupt0”和“interrupt1”)分别硬连接到数字I/O引脚2和3。
    • Arduino Mega有六个硬件中断,包括引脚21,20,19和18上的附加中断(“interrupt2”到“interrupt5”)。
    • 你可以定义该程序并指定上升沿,下降沿或两者的条件。在这些特定条件下,将处理中断。

    中断类型:

    • 硬件中断 - 它们响应外部事件而发生,例如外部中断引脚变为高电平或低电平。
    • 软件中断 - 它们响应于在软件中发送的指令而发生。“Arduino语言”支持的唯一类型的中断是attachInterrupt()函数。

    具体请参考:

    attachInterrupt()函数

    attachInterrupt(interrupt,function,mode)
    

    interrupt:中断源(在Arduino中,中断源可选值为0或1,一般分别对应2号和3号引脚)

    function:需要中断的函数名

    mode:

    • LOW(低电平触发)、

    • CHANGE(在引脚电平变化时触发)、

    • RISING(低电平变为高电平触发)、

    • FALLING(高电平变为低电平触发)

    外部中断只能用到数字IO口2和3,interrupt表示中断口初始0或1,表示一个功能函数,mode:LOW低电平中断,CHANGE有变化就中断,RISING上升沿中断,FALLING 下降沿中断。

    detachInterrupt()函数

    detachInterrupt(interrupt)
    

    中断开关函数,interrupt=1 开,interrupt=0 关。

    范例:

    detachInterrupt(1//打开中断
    

    中断使能函数

    interrupts()// 使能中断
    
    noInterrupts() //禁止中断
    

    Arduino串口收发函数

    Arduino Uno R3开发板上,硬件串口位于Rx(0)和Tx(1)引脚上,Arduino的USB口通过转换芯片与这两个引脚连接。该转换芯片会通过USB接口在PC机上虚拟出一个用于Arduino通讯的串口,我们下载程序也是通过串口进行的。

    在这里插入图片描述

    Serial.begin(speed)

    • 串口定义波特率函数,设置串行每秒传输数据的速率(波特率),可以指定Arduino从电脑交换讯息的速率,通常置于setup()函数中。

    • 原型:

    • Serial.begin(speed)

      • Serial.begin(speed, config)

    参数:

    • speed:波特率,一般取值9600,115200等。在同计算机通讯时,使用下面这些值:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600或 115200 bps(每秒位元组)

    • config:设置数据位、校验位和停止位。默认SERIAL_8N1表示8个数据位,无校验位,1个停止位。

    • 返回值:无。

    范例:

    Serial.begin(9600

    Serial.end()

    • 描述:禁止串口传输。此时串口Rx和Tx可以作为数字IO引脚使用。
    • 原型:Serial.end()
    • 参数:无。
    • 返回值:无。

    Serial.print()

    • 描述:串口输出数据,写入字符数据到串口。
    • 原型:
      • Serial.print(val)
      • Serial.print(val, format)
    • 参数:
      • val:打印的值,任意数据类型。
      • config:输出的数据格式。BIN(二进制)、OCT(八进制)、DEC(十进制)、HEX(十六进制)。对于浮点数,此参数指定要使用的小数位数。
    • 示例:
      • Serial.print(75); // 列印出 “75”
      • Serial.print(75, DEC); //列印出 “75”
      • Serial.print(75, HEX); // “4B” (75 的十六进位)
      • Serial.print(75, OCT); // “113” (75 in的八进位)
      • Serial.print(75, BIN); // “1001011” (75的二进位)
      • Serial.print(75, BYTE); // “K” (以byte进行传送,显示以ASCII编码方式)
      • Serial.print(1.23456, 0) 得到 “1”
      • Serial.print(1.23456, 2) 得到 “1.23”
      • Serial.print(1.23456, 4) 得到 “1.2346”
      • Serial.print(‘N’) 得到 “N”
      • Serial.print(“Hello world.”) 得到 “Hello world.”
    • 返回值:返回写入的字节数。

    Serial.println()

    • 描述:串口输出数据并换行。
    • 原型:
      • Serial.println(val)
      • Serial.println(val, format)
    • 参数:
      • val:打印的值,任意数据类型。
      • config:输出的数据格式。
    • 返回值:返回写入的字节数。

    Serial.available()

    • 描述:判断串口缓冲区的状态,返回从串口缓冲区读取的字节数。
    • 原型:Serial.available()
    • 参数:无。
    • 返回值:可读取的字节数, 如果回传值是0代表所有序列埠上资料都已经被read()函式读取。

    范例:

    int count = Serial.available();
    

    Serial.read()

    • 描述:读取串口数据,一次读一个字符,读完后删除已读数据。
    • 原型:Serial.read()
    • 参数:无。
    • 返回值:返回串口缓存中第一个可读字节,当没有可读数据时返回-1,整数类型。

    范例:

     int data = Serial.read();
    

    Serial.readBytes()

    • 描述:从串口读取指定长度的字符到缓存数组。
    • 原型:Serial.readBytes(buffer, length)
    • 参数:
      • buffer:缓存变量。
      • length:设定的读取长度。
    • 返回值:返回存入缓存的字符数。

    Serial.flush()

    • 描述:清空缓冲器。 有时候因为资料速度太快,超过程式处理资料的速度,你可以使用此函式清除缓冲区内的资料。经过此函式可以确保缓冲区(buffer)内的资料都是最新的。
    • 原型:  Serial.flush();
    • 参数: 无
    • 返回值: 无

    范例:

    Serial.flush();
    

    Arduino语言库文件

    官方库文件

    · EEPROM - EEPROM读写程序库

    · Ethernet - 以太网控制器程序库

    · LiquidCrystal - LCD控制程序库

    · Servo - 舵机控制程序库

    · SoftwareSerial - 任何数字IO口模拟串口程序库

    · Stepper - 步进电机控制程序库

    · Wire - TWI/I2C总线程序库

    · Matrix - LED矩阵控制程序库

    · Sprite - LED矩阵图象处理控制程序库

    Arduino 内部集成电路I2C

    内部集成电路(I2C)是用于微控制器和新一代专用集成电路之间的串行数据交换系统。当它们之间的距离很短(接收器和发射器通常在同一个印刷电路板上)时使用。通过两根导线建立连接。一个用于数据传输,另一个用于同步(时钟信号)。

    Arduino板的I2C引脚

    I2C总线由两个信号组成 - SCL和SDA。SCL是时钟信号,SDA是数据信号。当前总线主机总是产生时钟信号。一些从设备可能迫使时钟低电平以延迟主设备发送更多数据(或者在主设备尝试将数据写出之前请求更多的时间来准备数据)。这被称为“时钟伸展”。

    以下是不同Arduino板的引脚:

    • Uno, Pro Mini A4 (SDA), A5 (SCL)
    • Mega, Due 20 (SDA), 21 (SCL)
    • Leonardo, Yun 2 (SDA), 3 (SCL)

    Arduino I2C

    我们有两种模式 - 主代码和从代码 - 使用I2C连接两个Arduino板。它们是:

    • Master Transmitter / Slave Receiver 主发射器/从接收器
    • Master Receiver / Slave Transmitter 主接收器/从发射器

    主发射器/从接收器

    让我们现在看看什么是主发送器和从接收器。

    主发射器

    以下函数用于初始化Wire库,并将I2C总线作为主器件或从器件加入。这通常只被调用一次。

    • Wire.begin(地址) - 在我们的例子中,地址是7位从地址,因为未指定主机,它将作为主机加入总线。
    • Wire.beginTransmission(地址) - 开始向给定地址的I2C从设备发送数据。
    • Wire.write() - 用于从主设备传输到从设备的队列字节(在beginTransmission()和endTransmission()之间的调用)。
    • Wire.endTransmission() - 结束由beginTransmission()开始的对从设备的传输,并传输由wire.write()排队的字节。

    从接收器

    使用以下函数:

    • Wire.begin(地址) - 地址是7位从地址。
    • Wire.onReceive(收到的数据处理程序) - 当从设备从主设备接收数据时调用的函数。
    • Wire.available() - 返回Wire.read()可用于检索的字节数,应在Wire.onReceive()处理程序中调用。

    在这里插入图片描述在这里插入图片描述

    展开全文
  • 上班第一天(6)--一个程序员的成长史(15)

    千次阅读 多人点赞 2016-11-17 13:08:56
    个程序员的成长史》系列第十五篇。
  • 看过我之前的教程,应该都知道,新手的最佳挖矿教程啊,哈哈 还是不多说啥,直接进入教程: 第步,老规矩,先搞个BTW的钱包地址(可以是BTW全节点钱包、交易所、比特派钱包) 这里推荐比特币交易网...
  • 入职第一天

    千次阅读 2016-04-20 18:17:47
    这是我写的第五篇文章,是关于我入职的第一天,分享我的故事经历,和大家一起聊聊职场。
  • 我可以请你吃一千块钱的饭,也可以请你喝两千块钱的酒,但是你欠我的一百块钱你得还,不为什么,这是规矩,做人最起码的原则。 目录 借钱之惆怅,感慨万千 有些人,总喜欢从门缝里看人,“容易把人看扁了...
  • 这个简单的计算告诉我们计算星期的一个基本思路:首先,先要知道在想算的日子之前的一个确定的日子是星期几,拿这一天做为推算的标准,也就是相当于一个计算的“原点”。其次,知道想算的日子和这个确定的日子之间...
  • 推荐9个能让你看一天的网站

    万次阅读 多人点赞 2020-04-01 16:12:57
    分享的这9个保证另你意外的网站,每个都非常实用!非常干货!毫不客气的说,这些网站最少值10万块钱。 利用好这些网站,会让你各方面的技能都...这是个可以躺在家里,就能环游世界的神奇网站。 世界那么大,绝大多...
  • 这是个面向编程新手、热爱编程、对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编程语言的项目、让生活变得更美好的工具、书籍、学习笔记、教程等,这些开源项目大多都是非常容易上手,而且非常 Cool。...
  • 不查日历怎么知道任何一天是星期几作者:刘夙 2004-5-2 1:53:20 博客中国(Blogchina.com) 文/葛民勤---------------------------------------------------------------------------摘要: 最常见的公式:W = [Y...
  • 使用ls筛选某一天的文件

    千次阅读 2017-05-02 09:56:05
    使用ls筛选某一天的文件ls命令,即便是对于程序开发人员,也可以说是使用频率最高的一个命令了。但是,在很多人的印象中,ls命令仅仅是用来查看目录与文件的命令而已。如果要说筛选文件,你的第一反应可能是:find...
  • 这个题目的背后,它透露出这样种情绪,股对农村生活清心寡欲的期望,股对城市工作奋斗打拼的厌倦。
  • linux开发者的一天

    千次阅读 2010-11-12 10:56:00
    Linux内核是项浩大的工程,在全球拥有众多贡献者。她广泛的用途和领先的优势每天源源不断地吸引新的用户加入她的阵营。可是有时候用户会发现代码中存在问题,还有些用户会觉得必须在内核添加他们自己的功能才能...
  • 在南大富士通的一百天实习经历,既让我在编程技术上有了很大进步,也让我逐渐适应了职场的生活。
  • Vue3.0 凉凉了?Vue 最黑暗的一天

    万次阅读 2020-02-14 13:25:33
    这是目前为止 Vue 最黑暗的一天吗?看起来是的。一直团结追随这个项目方向的社区已经分裂了。但我希望人们能够重新审视这个提案,它没有破坏任何东西,只要他们想,仍然可以按照选项的类型来组织它们,但是可以做到...
  • 名合格的程序员应该是什么样子

    万次阅读 多人点赞 2019-06-28 10:01:05
    我听完随口扔了句,“在我的意料之中。”因为她平时的成绩也就在二本线上下徘徊。 这句话挺伤人的,尤其是对于高考失利的妹妹来说,她听完我的话,立马就哭了起来,情绪非常激动,质问母亲为什么要打电话告诉我...
  • 我用九时间,深挖条闲鱼诈骗黑色产业链。

    千次阅读 多人点赞 2019-12-27 21:58:14
    大家好,我是凌云。因为平常干的事比较特殊,所以我微信上加了挺多的警察,有时间会跟他们块聊聊技术,分析一些案件。2019年12月15号,有个警察老哥跟我聊了聊二手平台诈骗的事,两后...
  • 关注「实验楼」,每天分享个项目教程 谷歌工程师每天大概写100-150行代码,这在Quora上引起了不小的风波。正文共:2171 字 预计阅读时间:6 分钟前段时间...
  • 个毕业一年程序员的感悟

    千次阅读 多人点赞 2018-07-22 00:01:04
    所以,又开始习惯性地复盘过去的段经历,用现在不成熟的想法去回顾之前更不成熟的想法,哈哈。 挑出我认为比较重要的四点感受来说吧。 .理论知识的重要性 这个问题,我在毕业半年之后就意识到了。经常...
  • 如果有人问,在中国哪个开放平台上做应用最能赚钱?可能很多人还不知道。但如果告诉你以下信息,...当然在此之前,李勇也摸索了很长段时间,探索适合淘宝平台的应用模式。 李勇并不是个特例,到2010年底,在淘宝开
  • 回忆美好的一百件事

    千次阅读 2008-01-22 13:07:00
    回忆美好的一百件事回忆美好的一百件事来源:http://autumnnotes.spaces.live.com/Blog/cns!8F91FC670E9C1FCC!2048.entry 小猫。不开心的事情,不想记得。我依然深信,我是可以忘记的。 尽管,可能要用很多很多的...
  • 爬虫100例的原则上最后篇文章,很激动,有很多话想说,请允许我写这么篇唠唠叨叨的文章。 写爬虫系列很迷,估计和很多进入爬虫编码圈的人一样,单纯的我只想看一些图片,然而页页的去翻,真的好麻烦,总想着...
  • 我是如何自学C语言的(个菜鸟的学习路)

    万次阅读 多人点赞 2018-02-07 21:26:31
    到最后要学完的时候,有一个作业是做一个简易通讯录的程序,一百多行的代码,我敲完顺利编译运行!没有错误,如果我一直偷懒不动手,是不可能达到的。现在想想,编程也是一个不断试错的过程,一开始学的时候,是不断...
  • 十五开发款安卓APP并成功发布摘要功能展示,页面展示功能展示项目查看安卓app下载:简化版的微信小程序开发过程界面设计功能设计后台开发前端开发安卓app一些功能的实现安卓登录状态保存页面获取登录用户的信息...
  • 迷茫,仿佛就是团乌云,笼罩在每个心中怀有抱负的人的头上。每当夜深人静,思绪归于对自己人生未来的严肃思考,不知去往何处的苦闷,再加之不断迫近的升学/就业选择的压力,尤其是一些看似周密的计划,由于想把...
  • 前几C和我聊天,他说想辞职,向我征询一下意见。我觉得他现在这个年龄,所正面临的职场跳槽问题,可能许多职场后辈们正面临着,或是即将马上经历,于是觉得很有必要写出来,因为有些问题我现在也正面临着考验,故...
  • 如何成为名AI人工智能算法工程师?

    万次阅读 多人点赞 2019-06-30 12:25:21
    正好回头看看自己这一年走过的路,进行次经验总结。 来看看你距离成为名AI工程师还有多远吧~ ⭐具体内容: 我是因为什么开始接触敲代码 人工智能/机器学习/深度学习 自学如何寻找学习资料 如何选择编...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,111
精华内容 48,844
关键字:

一百天之前是哪一天