L'hardware finale e' stato montato nella sua versione finale
-Arduino Due
-Ethernet Shield
-Amplifier Shield (autoprodotto)
adesso si passa al codice
per Arduino e' stato riutilizzato quasi tutto il codice di questo post
C'e' da annotare che (evindenziato in giallo)
1) per usare il comando itoa in Arduino Due si deve aggiungere #include "itoa.h"
2) per far funzionare il convertitore analogico digitale di Arduino due a 12 bit lo si deve richiedere esplicitamente con il comando analogReadResolution
Codice Arduino
------------------------------------------
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include "itoa.h"
byte ardmac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ardip(192, 168, 0, 2);
byte Server[] = { 192,168,0,1 };
unsigned int porta = 7755;
unsigned int localPort = 8888; // local port to listen on
int sensorPin = A3;
int sensorValue = 0;
EthernetUDP Udp;
char buf[12]; // "-2147483648\0"
void setup() {
Ethernet.begin(ardmac,ardip);
Udp.begin(localPort);
analogReadResolution(12);
}
void loop() {
sensorValue = analogRead(sensorPin);
Udp.beginPacket(Server, porta);
Udp.write(itoa(sensorValue, buf, 10));
Udp.endPacket();
delay(100);
}
----------------------------------------
per il frontend di rappresentazione realtime dei dati e' stato scritto un programmino in Qt che implementa un server UDP e mostra i dati mediante la libreria QCustomplot
Codice Qt (4.8.5)
file .pro (le modifiche sono in giallo)
------------------------------------------
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = geolab
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
qcustomplot.cpp
HEADERS += mainwindow.h \
qcustomplot.h
FORMS += mainwindow.ui
------------------------------------------
in azzurro le righe di codice relative al server UDP mentre in giallo quelle relative alla visualizzazione del grafico
mainwindow.h
------------------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtNetwork>
#include <QVector>
#include "qcustomplot.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void ricevi();
private:
Ui::MainWindow *ui;
QUdpSocket *udpSocket;
};
#endif // MAINWINDOW_H
------------------------------------------
mainwindow.cpp
-------------------------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QUdpSocket>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->widget->addGraph();
ui->widget->xAxis->setLabel("x");
ui->widget->yAxis->setLabel("y");
ui->widget->xAxis->setRange(0, 10);
ui->widget->yAxis->setRange(0, 10);
ui->widget->replot();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
udpSocket = new QUdpSocket(this);
QString ip = "192.168.0.1";
udpSocket->bind(QHostAddress("192.168.0.1"), 7755);
connect(udpSocket, SIGNAL(readyRead()),
this, SLOT(ricevi()));
}
void MainWindow::ricevi(){
while (udpSocket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpSocket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
qDebug() <<datagram;
ui->widget->graph(0)->addData(i,datagram.toDouble());
ui->widget->graph(0)->rescaleValueAxis(true);
ui->widget->graph(0)->rescaleKeyAxis(true);
ui->widget->replot();
QString valore = datagram;
ui->label->setText("Lettura istantanea : "+valore);
}
}
-------------------------------------------