flutter and pico code for android accelerometer and bluetooth demo /************************* * main.dart *************************/ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import './home.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations([ // portrait only DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); runApp(MyApp());} class MyApp extends StatelessWidget{ MyApp({super.key}); @override Widget build(BuildContext context){ return GetMaterialApp( title: 'Flutter Template', debugShowCheckedModeBanner: false, theme: ThemeData( useMaterial3: true), home: Home());}} /************* * home.dart *************/ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import './accel.dart'; import './source.dart'; class Home extends StatelessWidget{ @override Widget build(BuildContext context){ return Scaffold( appBar:AppBar(title: Text('Ble with accel')), drawer: Drawer(child: ListView(children: [ ListTile(title: Text('Accel'), onTap:() {Get.to(Accel());}), ListTile(title: Text('Source'), onTap:() {Get.to(Source());}), ListTile(title: Text('Exit'), onTap:(){ SystemNavigator.pop(); })])), body: Center(child: SingleChildScrollView(child: Text(''' demo using phones accelerometer sending values to pico using bluetooth'''))));}} /******************** * accel.dart ********************/ import 'package:flutter/material.dart'; import 'dart:async'; import 'dart:typed_data'; import 'package:get/get.dart'; import 'package:sensors_plus/sensors_plus.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'ble_controller.dart'; class Accel extends StatefulWidget { const Accel({super.key}); @override State createState() => AccelState();} class AccelState extends State { AccelerometerEvent? accel; late StreamSubscription subs; late Timer timer; List packet=[0,0]; late BleController ble; late int x, old_x; late int y, old_y; void sendX(int x){ if (x > 2) packet[1] = 0x6c; else if (x < -2) packet[1] = 0x72; else if (x == 0) packet[1] = 0x6d; ble.send(packet); } void sendY(int y){ if (y > 2) packet[1] = 0x32; else if (y < -2) packet[1] = 0x33; else if (y == 0) packet[1] = 0x31; ble.send(packet); } @override void dispose(){ super.dispose(); subs.cancel(); timer.cancel();} @override void initState() { old_x = 0; old_y = 0; super.initState(); subs = accelerometerEventStream().listen((AccelerometerEvent event){ setState((){ accel = event; });}); // update bluetooth packet timer = Timer.periodic(const Duration(milliseconds: 200), (_) { setState(() { x = accel!.x.toInt(); if (old_x != x) { sendX(x); old_x = x;} y = accel!.y.toInt(); if (old_y != y) {sendY(y); old_y = y;} });});} @override Widget build(BuildContext context) { ble = Get.put(BleController()); return Scaffold(appBar: AppBar(title: Text('Accelerometer Example')), body: Center(child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton(child: Obx(() => Text('${ble.status.value}')), onPressed: ble.connect), SizedBox(height:20), Text('Accelerometer Data:',style: TextStyle(fontSize: 20)), SizedBox(height: 10), Text('X: ${accel!.x.toInt()}, ' 'Y: ${accel!.y.toInt()}',) ])));}} /*************** * source.dart ***************/ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:flutter_syntax_view/flutter_syntax_view.dart'; import 'dart:async'; import 'dart:io'; import 'dart:convert'; import './codes.dart'; // function to show source code Widget showSource(String code, BuildContext context){ num line = LineSplitter().convert(code).length; return SizedBox(height:16.0 * line, child:SyntaxView( code: code, syntax: Syntax.DART, syntaxTheme: SyntaxTheme.vscodeDark(), withZoom:true, withLinesCount:true, expanded:true));} class Source extends StatelessWidget{ @override Widget build(BuildContext context) { return Scaffold(appBar:AppBar(title: Text('Source Code')), body: SingleChildScrollView(child:Column(children:[ for (var i=0; i c; late QualifiedCharacteristic tx; var status = 'connect to bluetooth'.obs; void send(val) async{ await frb.writeCharacteristicWithoutResponse(tx, value: val);} void connect() async { status.value = 'connecting...'; c = frb.connectToDevice(id: 'CC:33:31:CF:74:72').listen((state) { if (state.connectionState == DeviceConnectionState.connected) { status.value = 'connected'; tx=QualifiedCharacteristic( serviceId: Uuid.parse("FFE0"), characteristicId: Uuid.parse("FFE1"), deviceId: 'CC:33:31:CF:74:72');}});}} /************* * codes.dart *************/ // main.dart // home.dart // accel.dart // source.dart // ble_controller.dart List codes = [ ////////////// main.dart ''' /************************* * main.dart *************************/ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import './home.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations([ // portrait only DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); runApp(MyApp());} class MyApp extends StatelessWidget{ MyApp({super.key}); @override Widget build(BuildContext context){ return GetMaterialApp( title: 'Flutter Template', debugShowCheckedModeBanner: false, theme: ThemeData( useMaterial3: true), home: Home());}} ''', ////////////// home.dart ''' /************* * home.dart *************/ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import './accel.dart'; //import './help.dart'; //import './source.dart'; class Home extends StatelessWidget{ @override Widget build(BuildContext context){ return Scaffold( appBar:AppBar(title: Text('Ble with accel')), drawer: Drawer(child: ListView(children: [ ListTile(title: Text('Accel'), onTap:() {Get.to(Accel());}), ListTile(title: Text('Source'), onTap:() {Get.to(Source());}), ListTile(title: Text('Exit'), onTap:(){ SystemNavigator.pop(); })])), body: Center(child: SingleChildScrollView(child: Text(3 single quotes demo using phones accelerometer sending values to pico using bluetooth 3 single quotes)));}} ''', ////////////// accel.dart ''' /******************** * accel.dart ********************/ import 'package:flutter/material.dart'; import 'dart:async'; import 'dart:typed_data'; import 'package:get/get.dart'; import 'package:sensors_plus/sensors_plus.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'ble_controller.dart'; class Accel extends StatefulWidget { const Accel({super.key}); @override State createState() => AccelState();} class AccelState extends State { AccelerometerEvent? accel; late StreamSubscription subs; late Timer timer; List packet=[0,0]; late BleController ble; late int x, old_x; late int y, old_y; void sendX(int x){ if (x > 2) packet[1] = 0x6c; else if (x < -2) packet[1] = 0x72; else if (x == 0) packet[1] = 0x6d; ble.send(packet); } void sendY(int y){ if (y > 2) packet[1] = 0x32; else if (y < -2) packet[1] = 0x33; else if (y == 0) packet[1] = 0x31; ble.send(packet); } @override void dispose(){ super.dispose(); subs.cancel(); timer.cancel();} @override void initState() { old_x = 0; old_y = 0; super.initState(); subs = accelerometerEventStream().listen((AccelerometerEvent event){ setState((){ accel = event; });}); // update bluetooth packet timer = Timer.periodic(const Duration(milliseconds: 200), (_) { setState(() { x = accel!.x.toInt(); if (old_x != x) { sendX(x); old_x = x;} y = accel!.y.toInt(); if (old_y != y) {sendY(y); old_y = y;} });});} @override Widget build(BuildContext context) { ble = Get.put(BleController()); return Scaffold(appBar: AppBar(title: Text('Accelerometer Example')), body: Center(child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton(child: Obx(() => Text('\${ble.status.value}')), onPressed: ble.connect), SizedBox(height:20), Text('Accelerometer Data:',style: TextStyle(fontSize: 20)), SizedBox(height: 10), Text('X: \${accel!.x.toInt()}, ' 'Y: \${accel!.y.toInt()}',) ])));}} ''', ///////////// ble.dart ''' ''', ///////////// ble_controller.dart ''' /********************** * ble_controller.dart **********************/ import 'package:flutter/material.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:get/get.dart'; import 'dart:async'; import 'dart:typed_data'; import 'dart:convert'; import 'dart:io'; class BleController extends GetxController { final frb = FlutterReactiveBle(); late StreamSubscription c; late QualifiedCharacteristic tx; var status = 'connect to bluetooth'.obs; void send(val) async{ await frb.writeCharacteristicWithoutResponse(tx, value: val);} void connect() async { status.value = 'connecting...'; c = frb.connectToDevice(id: 'CC:33:31:CF:74:72').listen((state) { if (state.connectionState == DeviceConnectionState.connected) { status.value = 'connected'; tx=QualifiedCharacteristic( serviceId: Uuid.parse("FFE0"), characteristicId: Uuid.parse("FFE1"), deviceId: 'CC:33:31:CF:74:72');}});}} ''', ///////// source.dart ''' /*************** * source.dart ***************/ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:flutter_syntax_view/flutter_syntax_view.dart'; import 'dart:async'; import 'dart:io'; import 'dart:convert'; import './codes.dart'; // function to show source code Widget showSource(String code, BuildContext context){ num line = LineSplitter().convert(code).length; return SizedBox(height:16.0 * line, child:Padding( padding:EdgeInsets.fromLTRB(0,0,20,0), child:SyntaxView( code: code, syntax: Syntax.DART, syntaxTheme: SyntaxTheme.vscodeDark(), withZoom:true, withLinesCount:true, expanded:true)));} class Source extends StatelessWidget{ @override Widget build(BuildContext context) { return Scaffold(appBar:AppBar(title: Text('Source Code')), body: SingleChildScrollView(child:Column(children:[ for (var i=0; i