Designing an Air Quality Measurement System 4 – Air Quality Monitoring Mobile Application

Designing an Air Quality Measurement System 4 – Air Quality Monitoring Mobile Application

The following Flutter codes can be used to create a mobile application that visualizes air quality data in JSON format received over a Bluetooth device. These codes guide Flutter app developers in exchanging data via Bluetooth, parsing JSON data, and displaying this data with line charts.

The main features of these codes are:
1. Connecting a Bluetooth Device: Flutter app can use Bluetooth libraries such as bluetooth_serial or flutter_blue to connect to the Bluetooth device. These codes handle the Bluetooth connection and provide a channel for data exchange.

2. JSON Data Retrieval: Data from the Bluetooth device must be in JSON format. The data is read via Bluetooth and parsed into JSON format. These codes parse incoming JSON data to obtain air quality data such as temperature, humidity, and CO2 concentration.

3. Creating Line Charts: Flutter application converts data into line charts using a chart drawing library such as fl_chart. A separate line chart is created for each type of data (e.g. temperature, humidity, CO2 concentration). These charts show users how data changes over time.

4. Data Streaming and Update: Data is continuously received via Bluetooth and line graphs are updated. The user can observe up-to-date air quality information.

These codes provide a basic structure for air quality monitoring applications and allow users to instantly track data received from Bluetooth devices. This type of app can be useful for users who want to monitor air quality and keep track of environmental conditions.

First, don't forget to add the required package to your pubspec.yaml file:

 

dependencies:
   flutter:
     sdk:flutter
   bluetooth_serial: ^0.5.4 # adding bluetooth_serial package
   fl_chart: ^0.40.0 # adding fl_chart package

import 'package:flutter/material.dart';
import 'package:bluetooth_serial/bluetooth_serial.dart';
import 'package:fl_chart/fl_chart.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return MaterialApp(
       home:HomeScreen(),
     );
   }
}

class HomeScreen extends StatefulWidget {
   @override
   _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
   BluetoothConnection? connection;
   String data = '';
   List<double> _temperatureData = [];
   List<double> _humidityData = [];
   List<double> _co2Data = [];
   int _dataCount = 0;

   @override
   void initState() {
     super.initState();
     _connectToBluetoothDevice();
   }

   Future<void> _connectToBluetoothDevice() async {
     BluetoothDevice? device = await BluetoothDevice.connect("YOUR_DEVICE_MAC_ADDRESS");

     if (device.isConnected) {
       connection = device.connection;
       connection!.input.listen((Uint8List data) {
         String receivedData = String.fromCharCodes(data);
         setState(() {
           data = receivedData;
         });

         try {
           Map<String, dynamic> jsonData = json.decode(receivedData);
           double temperature = jsonData["Temperature"];
           double humidity = jsonData["Humidity"];
           double co2 = jsonData["CO2_Density"];
           setState(() {
             _temperatureData.add(temperature);
             _humidityData.add(humidity);
             _co2Data.add(co2);
             _dataCount++;
           });
         } catch (e) {
           print("JSON parsing error: $e");
         }
       });
     }
   }

   @override
   Widget build(BuildContext context) {
     return Scaffold(
       appBar: AppBar(
         title: Text('Air Quality Measurement'),
       ),
       body: Center(
         child: Column(
           mainAxisAlignment: MainAxisAlignment.center,
           children: <Widget>[
             data.isNotEmpty
                 ? LineChart(
                     LineChartData(
                       gridData: FlGridData(show: false),
                       titlesData: FlTitlesData(show: false),
                       borderData: FlBorderData(
                         show:true,
                         border: Border(
                           bottom: BorderSide(color: Colors.black, width: 2),
                           left: BorderSide(color: Colors.black, width: 2),
                         ),
                       ),
                       minX:0,
                       maxX: _dataCount.toDouble(),
                       minY:0,
                       maxY: 100,
                       lineBarsData: [
                         _createLineChartBar(_temperatureData, Colors.red),
                         _createLineChartBar(_humidityData, Colors.green),
                         _createLineChartBar(_co2Data, Colors.blue),
                       ],
                     ),
                   )
                 : Text('Connecting to Bluetooth device...'),
           ],
         ),
       ),
     );
   }

   LineChartBarData _createLineChartBar(List<double> data, Color color) {
     return LineChartBarData(
       spots: data.asMap().entries.map((entry) {
         return FlSpot(entry.key.toDouble(), entry.value);
       }).toList(),
       isCurved: true,
       colors: [color],
       dotData: FlDotData(show: false),
       belowBarData: BarAreaData(show: false),
     );
   }

   @override
   void dispose() {
     connection?.finish();
     super.dispose();
   }
}