274 lines
7.7 KiB
C++
274 lines
7.7 KiB
C++
#include <Adafruit_DS3502.h>
|
|
#include <Adafruit_ADS1015.h>
|
|
#include <BLEDevice.h>
|
|
#include <BLEServer.h>
|
|
#include <BLEUtils.h>
|
|
#include <BLE2902.h>
|
|
|
|
Adafruit_DS3502 ds3502 = Adafruit_DS3502();
|
|
Adafruit_ADS1115 ads; // Construct an ads1015 at the default address: 0x48
|
|
|
|
/* For this example, make the following connections:
|
|
* DS3502 RH to 5V
|
|
* DS3502 RL to GND
|
|
* DS3502 RW to the pin specified by WIPER_VALUE_PIN
|
|
*/
|
|
|
|
BLEServer *pServer = NULL;
|
|
BLECharacteristic * pTxCharacteristic;
|
|
bool deviceConnected = false;
|
|
bool oldDeviceConnected = false;
|
|
uint8_t txValue = 0;
|
|
|
|
// See the following for generating UUIDs:
|
|
// https://www.uuidgenerator.net/
|
|
|
|
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
|
|
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
|
|
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
|
|
|
|
class MyServerCallbacks: public BLEServerCallbacks {
|
|
void onConnect(BLEServer* pServer) {
|
|
deviceConnected = true;
|
|
};
|
|
|
|
void onDisconnect(BLEServer* pServer) {
|
|
deviceConnected = false;
|
|
}
|
|
};
|
|
|
|
String inputString;
|
|
bool data_ok = false;
|
|
|
|
class MyCallbacks: public BLECharacteristicCallbacks {
|
|
void onWrite(BLECharacteristic *pCharacteristic) {
|
|
std::string rxValue = pCharacteristic->getValue();
|
|
|
|
if (rxValue.length() > 0) {
|
|
Serial.println("*********");
|
|
Serial.print("Received Value: ");
|
|
inputString = String();
|
|
for (int i = 0; i < rxValue.length(); i++)
|
|
{
|
|
inputString += rxValue[i];
|
|
}
|
|
data_ok = true;
|
|
//Serial.print(rxValue[i]);
|
|
Serial.print(inputString);
|
|
Serial.println();
|
|
Serial.println("*********");
|
|
}
|
|
}
|
|
};
|
|
|
|
void ble_ini()
|
|
{
|
|
// Create the BLE Device
|
|
BLEDevice::init("Looper Service");
|
|
|
|
// Create the BLE Server
|
|
pServer = BLEDevice::createServer();
|
|
pServer->setCallbacks(new MyServerCallbacks());
|
|
|
|
// Create the BLE Service
|
|
BLEService *pService = pServer->createService(SERVICE_UUID);
|
|
|
|
// Create a BLE Characteristic
|
|
pTxCharacteristic = pService->createCharacteristic(
|
|
CHARACTERISTIC_UUID_TX,
|
|
BLECharacteristic::PROPERTY_NOTIFY
|
|
);
|
|
|
|
pTxCharacteristic->addDescriptor(new BLE2902());
|
|
|
|
BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
|
|
CHARACTERISTIC_UUID_RX,
|
|
BLECharacteristic::PROPERTY_WRITE
|
|
);
|
|
|
|
pRxCharacteristic->setCallbacks(new MyCallbacks());
|
|
|
|
// Start the service
|
|
pService->start();
|
|
|
|
// Start advertising
|
|
pServer->getAdvertising()->start();
|
|
Serial.println("Waiting a client connection to notify...");
|
|
}
|
|
|
|
//int stepPin = 13;
|
|
//int dirPin = 27;
|
|
//int enPin = 33;
|
|
//
|
|
//int stepsPerRevolution = 800; //amount of turns 800=1turn
|
|
//int delayTime = 1000; //speed
|
|
|
|
#define DIR 27
|
|
#define PWM 13
|
|
|
|
uint8_t pot_value = 63;
|
|
bool auto_mode = false;
|
|
|
|
// the setup routine runs once when you press reset:
|
|
void setup() {
|
|
// initialize the digital pin as an output.
|
|
// pinMode(stepPin, OUTPUT);
|
|
// pinMode(dirPin, OUTPUT);
|
|
// pinMode(enPin, OUTPUT);
|
|
// digitalWrite(enPin,HIGH);
|
|
pinMode(DIR, OUTPUT);
|
|
ledcSetup(0, 5000, 8);
|
|
ledcAttachPin(PWM, 0);
|
|
stop();
|
|
Serial.begin(115200);
|
|
ble_ini();
|
|
Serial.println("Adafruit DS3502 Test");
|
|
|
|
if (!ds3502.begin()) {
|
|
Serial.println("Couldn't find DS3502 chip");
|
|
while (1);
|
|
}
|
|
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
|
|
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
|
|
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
|
|
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
|
|
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
|
|
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
|
|
ads.begin();
|
|
ds3502.setWiper(pot_value);
|
|
}
|
|
|
|
// the loop routine runs over and over again forever:
|
|
bool flag_auto = false;
|
|
void loop() {
|
|
if (!deviceConnected && oldDeviceConnected) {
|
|
delay(500); // give the bluetooth stack the chance to get things ready
|
|
pServer->startAdvertising(); // restart advertising
|
|
Serial.println("start advertising");
|
|
oldDeviceConnected = deviceConnected;
|
|
}
|
|
// connecting
|
|
if (deviceConnected && !oldDeviceConnected) {
|
|
// do stuff here on connecting
|
|
oldDeviceConnected = deviceConnected;
|
|
}
|
|
|
|
if (data_ok)
|
|
{
|
|
//data_ok = false;
|
|
if ((inputString == "D")||(inputString == "d"))
|
|
{
|
|
//left();
|
|
if (auto_mode) left(255);
|
|
}
|
|
else if ((inputString == "B")||(inputString == "b"))
|
|
{
|
|
//right();
|
|
if (auto_mode) right(255);
|
|
}
|
|
else if ((inputString == "E")||(inputString == "e"))
|
|
{
|
|
if (auto_mode)
|
|
{
|
|
if (pot_value<127) pot_value++;
|
|
ds3502.setWiper(pot_value);
|
|
delay(10);
|
|
}
|
|
}
|
|
else if ((inputString == "G")||(inputString == "g"))
|
|
{
|
|
if (auto_mode)
|
|
{
|
|
if (pot_value>0) pot_value--;
|
|
ds3502.setWiper(pot_value);
|
|
delay(10);
|
|
}
|
|
}
|
|
else if ((inputString == "H")||(inputString == "h"))
|
|
{
|
|
if (auto_mode)
|
|
{
|
|
pot_value=63;
|
|
ds3502.setWiper(pot_value);
|
|
}
|
|
}
|
|
else if ((inputString == "f")||(inputString == "F"))
|
|
{
|
|
if (!flag_auto)
|
|
{
|
|
auto_mode=!auto_mode;
|
|
Serial.println(auto_mode);
|
|
flag_auto = true;
|
|
}
|
|
}
|
|
else if (inputString == 0)
|
|
{
|
|
if (auto_mode) stop();
|
|
flag_auto = false;
|
|
}
|
|
}
|
|
if (!auto_mode) pot();
|
|
}
|
|
|
|
//void right()
|
|
// {
|
|
// digitalWrite(dirPin, HIGH);
|
|
// digitalWrite(stepPin, HIGH);
|
|
// delayMicroseconds(delayTime);
|
|
// digitalWrite(stepPin, LOW);
|
|
// delayMicroseconds(delayTime);
|
|
// }
|
|
//
|
|
//void left()
|
|
// {
|
|
// digitalWrite(dirPin, LOW);
|
|
// digitalWrite(stepPin, HIGH);
|
|
// delayMicroseconds(delayTime);
|
|
// digitalWrite(stepPin, LOW);
|
|
// delayMicroseconds(delayTime);
|
|
// }
|
|
|
|
void right(uint8_t value)
|
|
{
|
|
digitalWrite(DIR, HIGH);
|
|
ledcWrite(0, value);
|
|
}
|
|
|
|
void left(uint8_t value)
|
|
{
|
|
digitalWrite(DIR, LOW);
|
|
ledcWrite(0, value);
|
|
}
|
|
|
|
void stop()
|
|
{
|
|
digitalWrite(DIR, LOW);
|
|
ledcWrite(0, 0);
|
|
}
|
|
|
|
//#define VCC 5000
|
|
#define POT 10000
|
|
|
|
void pot() {
|
|
float wiper_value_in = ads.readADC_SingleEnded(1)*0.1875;
|
|
// Serial.print("Voltage input: ");
|
|
// Serial.print(wiper_value_in);
|
|
// Serial.print(" mV, ");
|
|
voltage(wiper_value_in);
|
|
}
|
|
|
|
void voltage(float volt)
|
|
{
|
|
float VCC = ads.readADC_SingleEnded(2)*0.1875;
|
|
// Serial.print("Voltage suppy: ");
|
|
// Serial.print(VCC);
|
|
// Serial.print(" mV, ");
|
|
float resistor = (volt*POT)/(VCC);
|
|
uint8_t value = uint8_t ((resistor*128)/POT);
|
|
ds3502.setWiper(value);
|
|
float wiper_value_out = ads.readADC_SingleEnded(0)*0.1875;
|
|
// Serial.print("Voltage output: ");
|
|
// Serial.print(wiper_value_out);
|
|
// Serial.println(" mV");
|
|
}
|