OpenGL和pcDuino搭建数字示波器
看到大神们用Arduino、AVR做示波器,感觉很好玩,手头的pcDuino能不能做呢?一不做二不休,现在我们就自己用pcDuino做一个。
#include "OpenGLwidget.h"
#include <QTimer>
#include <QKeyEvent>
#include <math.h>
#include <iostream>
#include <GL/glu.h>
#include <Arduino.h>
#include <Serial.h>
#include <wiring_private.h>
//出于性能考虑宏定义一些必要的常量计算
//step定义opengl的x轴步长,即把x轴的-1到1均分成窗口的宽度(像素)
#define STEP 2/800.0
//units定义了窗口的x轴有800个点
#define UNITS 800
//pcduino的12bits ADC范围是0~4095,正负各4095
#define ANALOGVALUE 4095*2
//定义opengl的顶点二维数组,800个点,每个点由两个float组成
GLfloat ver[UNITS][2];
//定义了x轴的起步值,-1.0即屏幕的最左边
GLfloat xstep = -1.0;
//openglwidget的构造器,设置了窗口大小、窗口标题和更新opengl画布的signal
OpenGLWidget::OpenGLWidget( QWidget* parent)
: QGLWidget(parent){
setGeometry( 0, 30, 800, 600 );
setWindowTitle("Joker's OpenGL Framework");
t = new QTimer(this);
connect(t, SIGNAL(timeout()), this, SLOT(updateGL()));
t->start(0);
}
OpenGLWidget::~OpenGLWidget(){
}
//opengl的初始化函数
void OpenGLWidget::initializeGL(){
glShadeModel( GL_SMOOTH );
//设置颜色清空颜色,参数依次为RGBA,这里是一个我觉得比较帅气的灰色:)
glClearColor( 0.3, 0.3, 0.3, 1.0 );
glClearDepth( 1.0 );
//开启深度测试
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
//开启opengl的反锯齿
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
}
//opengl的绘制函数,调用一次绘制一帧画面
void OpenGLWidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//清空颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
//定义视点、原点和视角俯仰,由于这个例子只是2d绘图,可以忽略
gluLookAt (0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
//绘制两条直线代表x和y坐标轴
glBegin(GL_LINES);
glColor3f(0.5,0.5,0.5);
//这两个点可以画x轴
glVertex2f(-1.0f, 0.0f);
glVertex2f(1.0f, 0.0f);
//这两个点可以画y轴
glVertex2f(0.0f, -1.0f);
glVertex2f(0.0f, 1.0f);
glEnd();
//绘制波形,用opengl的一个line strip定义,line strip其实就是一组点连成的线
glBegin(GL_LINE_STRIP);
//定义line strip的颜色,这里也是我认为比较帅气的绿色,哈哈
glColor3f(0.0,1.0,0.0);
//这个循环会通过analogRead取得电压数值,并把这个电压值转换成波形的y值,写入顶点数组
for(int i=0;i<UNITS;i++){
*(ver[i]) = xstep+=STEP;
*(ver[i]+1) = analogRead(5)/ANALOGVALUE;
glVertex2fv(ver[i]);
}
//std::cout<<analogRead(5)/4095.0*2<<std::endl;
glEnd();
//把顶点数据压入opengl的渲染管道,开始绘图
glFlush();
}
//窗口大小变化的回调函数
void OpenGLWidget::resizeGL( int width, int height ){
//std::cout<<width<<"*"<<height<<std::endl;
if ( height == 0 )
{
height = 1;
}
glViewport(0,0,(GLint)width,(GLint)height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
//gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
//键盘按键的回调函数,按esc退出
void OpenGLWidget::keyPressEvent(QKeyEvent *e){
switch ( e->key() ){
case Qt::Key_Escape:
close();
}
}
编译运行,由于手头没有信号发生器,我就拿pcduino的PWM信号简单测试一下:



作者博客原文:http://blog.jokerjewel.com/articles/2013/12/21/1387628153495.html
OpenGL和pcDuino搭建数字示波器的更多相关文章
- Android OpenGL ES 开发(二): OpenGL ES 环境搭建
零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...
- 【游戏开发】基于VS2017的OpenGL开发环境搭建
一.简介 最近,马三买了两本有关于“计算机图形学”的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,“工欲善其事,必先利其器”.想学习图形 ...
- OpenGL(1)-环境搭建
写在前面 工作几年,开始沉心做技术,对自己的知识进行梳理. OpenGL是由khronos组织制定并维护的规范,并不是API. OpenGL在3.2之前采用的是立即渲染模式(固定渲染管线),3.2之后 ...
- OpenGL学习(1)—— 测试OpenGL环境是否搭建成功
一个用来验证OpenGL(glfw + glad)环境是否搭建成功的测试代码 内容为生成一个小窗口 #include <glad/glad.h> #include <GLFW/glf ...
- Windows Opengl ES 环境搭建
环境 OS:win7 专业版SP1 64位 编译器: VS 2013 express 的cl 软件 windows上运行OpenGL ES要用到第三方的头文件,库文件和dll.下载地址 http:// ...
- Linux OpenGL 实践篇-1 OpenGL环境搭建
本次实践所使用环境为CentOS 7. 参考:http://www.xuebuyuan.com/1472808.html OpenGL开发环境搭建: 1.opengl库安装 opengl库使用mesa ...
- OpenGL搭建环境-VS2012【OpenGL】
在学习cocos2dx时,其底层就用到了OpenGL,因此,想要能够精通cocos2dx,还是需要了解OpenGL的. 本着这个目的,开始搭建OpenGL的环境,并进行学习. OpenGL环境的搭建相 ...
- OpenGL ES之GLFW窗口搭建
概述 本章节主要总结如何使用GLFW来创建Opengl窗口.主要包括如下内容: OpenGl窗口创建介绍 GLFW Window版编译介绍 GLFW简单工程源码介绍 OpenGL窗口创建介绍 能用于O ...
- vs2012搭建OpenGL环境
1. 下载glut库 glut库地址为:http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL ...
随机推荐
- Contest2037 - CSU Monthly 2013 Oct (problem D :CX and girls)
[题解]: 最短路径问题,保证距离最短的同时,学妹权值最大,哈哈 [code]: #include<iostream> #include<queue> #include< ...
- 深入浅出百度地图API开发系列(2):创建地图
上一篇文章里,先介绍了一下百度地图API开发所涉及到的一些基础概念,包括投影,坐标系等基础概念,再有了这些基础后,我们可以开始开发自己的web地图了.先来个代码示例(建议大家都是用百度地图API大众版 ...
- xcode 上 crash 调试的三种方法
最近有新人问crash调试方法,简介记录如下: 模拟器调试 打开控制台查看输出日志 显示出错的行数 显示出错的函数iOS Crash跟踪 真机调试 首先修改真机调试的 bundle ID,使代码可以进 ...
- java第五课:方法
方法交换位置的三个步骤:1.把第一个盒子里的东西拿出来,放到一边2.把第二个盒子里的东西放到第一个盒子里3.捡起刚刚放到一边的东西,放到第二个盒子里 值传递:实际参数将内部保存的值,复制给方法的参数. ...
- 解决eclipse复制粘贴js代码卡死的问题
鸣谢:http://blog.csdn.net/zhangzikui/article/details/24805935 ---------------------------------------- ...
- Recommender Systems基于内容的推荐
基于内容的推荐的基本推荐思路是:用户喜欢幻想小说,这本书是幻想小说,则用户有可能喜欢这本小说 两方面要求:(1)知道用户的喜好:(2)知道物品的属性 基于内容的推荐相比协同过滤方法(个人观点):协同过 ...
- #pragma预处理指令讲解
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- POJ 2193 Lenny's Lucky Lotto Lists (DP)
题目链接 题意 : 给你两个数N和M,让你从1到M中找N个数组成一个序列,这个序列需要满足的条件是后一个数要大于前一个数的两倍,问这样的序列有多少,输出. 思路 : dp[i][j]代表着长度为 i ...
- linux distribution是什么?
linux distribution,即Linux发行版,有很多种类,包括Fedora,Ubuntu,Debian,Red Hat,SuSE等,其内核都是差不多的,只是界面设计和功能上各有千秋.
- MyBatis-Spring 执行SQL语句的流程
1. 从SqlSessionDaoSupport开始 通常我们使用MyBatis会让自己的DAO继承SqlSessionDaoSupport,那么SqlSessionDaoSupport是如何运作的呢 ...