2

I am new to this and I have purchased the Lilygo T-Wristband to prototype a watch that will vibrate upon receiving a 1-bit bluetooth signal from an android app. The goal is to allow the user to set the intensity of vibration (hence i am using the Real Time Playback, RTP, mode) that varies from 0-255. My device seems to not be working whenever i have the Wire1 code and I really am stuck at this point trying to make the motor work. I have attached the code below

#include <pcf8563.h>
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
#include <SPI.h>
#include <Time.h>
#include <Wire.h>
#include <WiFi.h>
#include "sensor.h"
#include "esp_adc_cal.h"
#include "avas.h.c"
#include "charge.h"
#include "BluetoothSerial.h" 
#include <Adafruit_DRV2605.h>
// init Class:
BluetoothSerial ESP_BT;
Adafruit_DRV2605 drv;

#define TP_PIN_PIN          33
#define I2C_SDA_PIN         21
#define I2C_SCL_PIN         22
#define RTC_INT_PIN         34
#define BATT_ADC_PIN        35
#define VBUS_PIN            36
#define TP_PWR_PIN          25
#define LED_PIN             4
#define CHARGE_PIN          32
#define DRV_SDA             15
#define DRV_SCL             13



TFT_eSPI tft = TFT_eSPI();  // Invoke library, pins defined in User_Setup.h
PCF8563_Class rtc;

char buff[256];
bool rtcIrq = false;
bool initial = 1;
bool otaStart = false;
RTC_DATA_ATTR int boots = 0;

uint8_t func_select = 0;
uint8_t omm = 99;
uint8_t xcolon = 0;
uint32_t targetTime = 0;       // for next 1 second timeout
uint32_t colour = 0;
int vref = 1100;

bool pressed = false;
uint32_t pressedTime = 0;
bool charge_indication = false;
uint8_t hh, mm, ss ;

void setupWire() {
  tft.init();
    tft.setRotation(1);
    tft.setSwapBytes(true);
    tft.pushImage(0, 0,  160, 80, avas);
    delay(2000);
  Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
  Wire.setClock(400000);
}
void setupPins() {
  pinMode(TP_PIN_PIN, INPUT);
  pinMode(TP_PWR_PIN, PULLUP);
  //! Must be set to pull-up output mode in order to wake up in deep sleep mode
  digitalWrite(TP_PWR_PIN, HIGH);
  pinMode(LED_PIN, OUTPUT);
  pinMode(CHARGE_PIN, INPUT_PULLUP);
  attachInterrupt(CHARGE_PIN, [] {
      charge_indication = true;
  }, CHANGE);
  if (digitalRead(CHARGE_PIN) == LOW) {
      charge_indication = true;
  }

}
void setupTFT() { //set-up fonts
  tft.init();
  tft.setRotation(1);
  tft.setSwapBytes(true);
  tft.fillScreen(TFT_WHITE);
  tft.setTextColor(TFT_YELLOW, TFT_WHITE); // Note: the new fonts do not draw the background color
}
void setupVolt() { //set-up battery monitoring
    esp_adc_cal_characteristics_t adc_chars;
    esp_adc_cal_value_t val_type = esp_adc_cal_characterize((adc_unit_t)ADC_UNIT_1, (adc_atten_t)ADC1_CHANNEL_6, (adc_bits_width_t)ADC_WIDTH_BIT_12, 1100, &adc_chars);
    //Check type of calibration value used to characterize ADC
    if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
//        Serial.printf("eFuse Vref:%u mV", adc_chars.vref);
        vref = adc_chars.vref;
    } else if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
//        Serial.printf("Two Point --> coeff_a:%umV coeff_b:%umV\n", adc_chars.coeff_a, adc_chars.coeff_b);
    } else {
//        Serial.println("Default Vref: 1100mV");
    }
}
void setupRTC() { //set-up RTC for time
    rtc.begin(Wire);
    //Check if the RTC clock matches, if not, use compile time
    rtc.check();
    RTC_Date datetime = rtc.getDateTime();
    hh = datetime.hour;
    mm = datetime.minute;
    ss = datetime.second;
}
void setupDRV(){

   Wire1.begin(DRV_SDA, DRV_SCL);
    Wire1.beginTransmission(DRV2605_ADDR);
    if (Wire1.endTransmission() != 0) {
        tft.setTextColor(TFT_RED, TFT_WHITE);
        tft.fillScreen(TFT_WHITE);
        tft.setCursor(0, 0);
        tft.println("Failed to connect DRV2605");
        delay(5000);
        esp_restart();
    }
    drv.begin(&Wire1);
    drv.setMode(DRV2605_MODE_REALTIME);

}
void setup(void) {
  // WiFi.mode(WIFI_OFF);

  Serial.begin(9600);
  setCpuFrequencyMhz(80);         // scaling it back saves so much of the precious battery life
  btStop();
  ESP_BT.begin("AVAS");
  setupDRV();
  setupWire();
  setupTFT();
  setupRTC();
  setupVolt();
  while (ESP_BT.available() == false) 
        {
          tft.setTextColor(TFT_BLUE, TFT_WHITE);
          tft.fillScreen(TFT_WHITE);
          tft.setCursor(0, 0);
          tft.println("Bluetooth not connected");
          delay(3000);
        }
  
  while (ESP_BT.available() == true){
          tft.setTextColor(TFT_RED, TFT_WHITE);
          tft.fillScreen(TFT_WHITE);
          tft.setCursor(0, 0);
          tft.println("Bluetooth connected");
          delay(5000);
          break;
  }
 

  if(boots == 0) //Run this only the first time
  {
    targetTime = millis() + 1000 ;  //adds 1 min to compiler time
    boots ++;
  }
  setupPins();
}
String Volt() {
    uint16_t v = analogRead(BATT_ADC_PIN);
    float battery_voltage = ((float)v / 4095.0) * 2.0 * 3.3 * (vref / 1000.0);
    return String(battery_voltage) + "V";
}
void RTC() {
  
    if (targetTime < millis()) {
        RTC_Date datetime = rtc.getDateTime();
        hh = 11;
        mm = datetime.minute;
        ss = datetime.second;
        // Serial.printf("hh:%d mm:%d ss:%d\n", hh, mm, ss);
        targetTime = millis() + 1000;
        if (ss == 0 || initial) {
            initial = 0;
            tft.setTextColor(TFT_GREEN, TFT_WHITE);
            tft.setCursor (8, 60);
            tft.print(__DATE__); // This uses the standard ADAFruit small font
        }
        tft.setTextColor(TFT_BLUE, TFT_WHITE);
        tft.drawCentreString(Volt(), 120, 60, 1); // Next size up font 2
        // Update digital time
        uint8_t xpos = 6;
        uint8_t ypos = 0;
        if (omm != mm) { // Only redraw every minute to minimise flicker
            // Uncomment ONE of the next 2 lines, using the ghost image demonstrates text overlay as time is drawn over it
            tft.setTextColor(0x39C4, TFT_WHITE);  // Leave a 7 segment ghost image, comment out next line!
            //tft.setTextColor(TFT_BLACK, TFT_BLACK); // Set font colour to black to wipe image
            // Font 7 is to show a pseudo 7 segment display.
            // Font 7 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : .
            tft.drawString("88:88", xpos, ypos, 7); // Overwrite the text to clear it
            tft.setTextColor(0xFBE0, TFT_WHITE); // Orange
            omm = mm;

            if (hh < 10) xpos += tft.drawChar('0', xpos, ypos, 7);
            xpos += tft.drawNumber(hh, xpos, ypos, 7);
            xcolon = xpos;
            xpos += tft.drawChar(':', xpos, ypos, 7);
            if (mm < 10) xpos += tft.drawChar('0', xpos, ypos, 7);
            tft.drawNumber(mm, xpos, ypos, 7);
        }

        if (ss % 2) { // Flash the colon
            tft.setTextColor(0x39C4, TFT_WHITE);
            xpos += tft.drawChar(':', xcolon, ypos, 7);
            tft.setTextColor(0xFBE0, TFT_WHITE);
        } else {
            tft.drawChar(':', xcolon, ypos, 7);
        }
    }
}

void loop() {
  if (charge_indication) {
      charge_indication = false;
      if (digitalRead(CHARGE_PIN) == LOW) {
          tft.pushImage(140, 55, 16, 16, charge);
      } else {
          tft.fillRect(140, 55, 16, 16, TFT_WHITE);
      }
  }
  if (digitalRead(TP_PIN_PIN) == HIGH) {
      if (!pressed) {
          initial = 1;
          targetTime = millis() + 1000;
          tft.fillScreen(TFT_WHITE);
          omm = 99;
          func_select = func_select + 1 > 2 ? 0 : func_select + 1;
          pressed = true;
          pressedTime = millis();
      } else {
          if (millis() - pressedTime > 3000) {
              esp_restart();
          }
      }
  } else {
      pressed = false;
  }
        RTC();
   if (ESP_BT.available()) 
        {
          byte pwm = ESP_BT.read(); //Read what we receive 
          // drv.setRealtimeValue(pwm);
          // drv.go();
          tft.setTextColor(TFT_RED, TFT_WHITE);
          tft.fillScreen(TFT_WHITE);
           tft.setCursor(0, 0);
          tft.println(pwm);
        }
  }        
1
  • 1
    start with simple code that runs the motor for one second, stops the motor for one second and repeats
    – jsotola
    Jan 20, 2023 at 16:06

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.