#include <Adafruit_APDS9960.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_LIS3MDL.h>
#include <Adafruit_LSM6DS33.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SHT31.h>
#include <Arduino.h>
#include <Adafruit_PWMServoDriver.h>
#include <MemoryFree.h>
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
#include "config.h"
/* #define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)*/
#define DEBOUNCE_TIME 15
#define CALC_INTERVAL 1000
#define ANEMOMETER_PIN 9 // Interrupt pin tied to anemometer reed switch
unsigned long _nextCalc;
unsigned long _timer;
volatile int _anemometerCounter;
volatile unsigned long last_micros_an;
int _windSpd;
int WindSensorPin = A0;
int WinD = 180;
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // the default address 0x40
RTC_PCF8523 rtc;
Adafruit_LSM6DS33 lsm6ds33; // accelerometer & gyro
Adafruit_APDS9960 apds9960; // proximity, light, color, gesture
Adafruit_BMP280 bmp280; // temperautre, barometer
Adafruit_LIS3MDL lis3mdl; // magnetometer
Adafruit_SHT31 sht30; // humidity
AdafruitIO_Feed *Temperature = io.feed("Temperature");
AdafruitIO_Feed *Humidity = io.feed("Humidity");
AdafruitIO_Feed *WindD = io.feed("Wind Direction");
AdafruitIO_Feed *WindS = io.feed("Wind Speed");
AdafruitIO_Feed *Pressure = io.feed("Pressure");
AdafruitIO_Feed *Vbat = io.feed("Vbat");
#define VBATPIN A6
#define USMIN 650 // This is the 'minimum' pulse length count (out of 4096) set to 650 for 7.8 Turns
#define USMAX 868 // This is the 'maximum' pulse length count (out of 4096) set to 2350 for 7.8 Turns
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
uint8_t MainWinch = 0;
uint8_t RudderWinch = 1;
short delayN;
short s = 1500;
short ss;
const int chipSelect = 10; //set the pin that the SD card is on
uint8_t proximity;
uint16_t r, g, b, c;
float temperature, pressure, altitude;
int magnetic_x, magnetic_y, magnetic_z;
int t;
float accel_x, accel_y, accel_z;
float gyro_x, gyro_y, gyro_z;
float humidity;
void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (! rtc.initialized() || rtc.lostPower()) {
Serial.println("RTC is NOT initialized, let's set the time!");
}
apds9960.begin();
apds9960.enableProximity(true);
apds9960.enableColor(true);
bmp280.begin();
lis3mdl.begin_I2C();
lsm6ds33.begin_I2C();
sht30.begin();
SD.begin(10);
rtc.start();
pwm.begin();
pwm.setOscillatorFrequency(27000000);
pwm.setPWMFreq(SERVO_FREQ); // Analog servos run at ~50 Hz updates
pwm.writeMicroseconds(MainWinch, 1500);
pwm.writeMicroseconds(RudderWinch, 1400);
pinMode(ANEMOMETER_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ANEMOMETER_PIN), countAnemometer, FALLING);
DateTime now = rtc.now();
t = now.minute();
// connect to io.adafruit.com
io.connect();
// wait for a connection
while(io.status() < AIO_CONNECTED) {
Serial.println(".");
delay(500);
}
}
void setServoPulse(uint8_t n, double pulse) {
double pulselength;
pulselength = 1000000; // 1,000,000 us per second
pulselength /= SERVO_FREQ; // Analog servos run at ~60 Hz updates
Serial.print(pulselength); Serial.println(" us per period");
pulselength /= 4096; // 12 bits of resolution
Serial.print(pulselength); Serial.println(" us per bit");
pulse *= 1000000; // convert input seconds to us
pulse /= pulselength;
Serial.println(pulse);
pwm.setPWM(n, 0, pulse);
}
void loop() {
io.run(); // io.run(); is required at the top for all sketches.
_timer = millis();
if (_timer > _nextCalc) {
_nextCalc = _timer + CALC_INTERVAL;
//UPDATE ALL VALUES
_windSpd = readWindSpd() / 1.151;
}
DateTime now = rtc.now();
proximity = apds9960.readProximity();
apds9960.getColorData(&r, &g, &b, &c);
temperature = (bmp280.readTemperature() * 1.8) + 32;
pressure = bmp280.readPressure();
altitude = bmp280.readAltitude(1013.25);
humidity = sht30.readHumidity();
lis3mdl.read();
magnetic_x = lis3mdl.x;
magnetic_y = lis3mdl.y;
magnetic_z = lis3mdl.z;
sensors_event_t accel;
sensors_event_t gyro;
sensors_event_t temp;
lsm6ds33.getEvent(&accel, &gyro, &temp);
accel_x = accel.acceleration.x;
accel_y = accel.acceleration.y;
accel_z = accel.acceleration.z;
gyro_x = gyro.gyro.x;
gyro_y = gyro.gyro.y;
gyro_z = gyro.gyro.z;
float measuredvbat = analogRead(VBATPIN);
measuredvbat *= 2; // we divided by 2, so multiply back
measuredvbat *= 3.6; // Multiply by 3.6V, our reference voltage
measuredvbat /= 1024; // convert to voltage
int sensorValue = analogRead(WindSensorPin);
float voltage = sensorValue * (3.3 / 1023);
if (voltage > 2.36 && voltage < 2.39) WinD = 0;
else if (voltage > 1.25 && voltage < 1.29) WinD = 45;
else if (voltage > 0.24 && voltage < 0.27) WinD = 90;
else if (voltage > 0.44 && voltage < 0.46) WinD = 135;
else if (voltage > 0.75 && voltage < 0.79) WinD = 180;
else if (voltage > 1.80 && voltage < 1.84) WinD = 225;
else if (voltage > 2.99 && voltage < 3.03) WinD = 270;
else if (voltage > 2.69 && voltage < 2.73) WinD = 315;
if (WinD < 46 && _windSpd > 0) {
pwm.writeMicroseconds(RudderWinch, 2500);
delay(3000);
pwm.writeMicroseconds(RudderWinch, 1400);
}
else if ( WinD == 90 || WinD == 270) {
pwm.writeMicroseconds(MainWinch, 1270);
}
else if (WinD == 135 || WinD == 225) {
pwm.writeMicroseconds(MainWinch, 1250);
}
else if (WinD == 180) {
pwm.writeMicroseconds(MainWinch, 1175);
}
/* ss = s;
s = map(WinD, 0, 360, 600, 2400);
pwm.writeMicroseconds(MainWinch, s);
delay(abs(ss - s) * 20);
if (ss - s > 100) pwm.writeMicroseconds(MainWinch, s + 15); // issues
else pwm.writeMicroseconds(MainWinch, s - 10); */
String dataString = ""; //making a string of sensor data to be logged
dataString += String(now.month()) += "/";
dataString += String(now.day()) += "/";
dataString += String(now.year()) += " ";
dataString += String(now.hour()) += ":";
dataString += String(now.minute()) += ":";
dataString += String(now.second()) += " ";
dataString += String(_windSpd) += " kn ";
dataString += String(WinD) += " Degrees ";
dataString += String(temperature) += " C Humidity:";
dataString += String(humidity) += "% ";
dataString += String(pressure) += " Pa ";
dataString += String(altitude) += " m MagX:";
dataString += String(magnetic_x) += " MagY:";
dataString += String(magnetic_y) += " MagZ:";
dataString += String(magnetic_z) += " uTesla Acc x:";
dataString += String(accel_x) += " Acc y:";
dataString += String(accel_y) += " Acc z:";
dataString += String(accel_z) += " m/s^2 Gyro x:";
dataString += String(gyro_x) += " Gyro y:";
dataString += String(gyro_y) += " Gyro z:";
dataString += String(gyro_z) += " dps Proximity:";
dataString += String(apds9960.readProximity()) += " R:";
dataString += String(r) += " G:";
dataString += String(g) += " B:";
dataString += String(b) += " C:";
dataString += String(c) += " Vbat:";
dataString += String(measuredvbat);
File dataFile = SD.open("datalog.txt", FILE_WRITE); //Opens new text file on SD card called datalog.txt
if (dataFile) {
digitalWrite(LED_BUILTIN, HIGH);
dataFile.println(dataString);
dataFile.close();
digitalWrite(LED_BUILTIN, LOW);
}
Serial.println(dataString);
Serial.println(freeMemory(), DEC);
delay(1000);
if(now.minute() - t > 2){
Temperature->save(temperature);
Humidity->save(humidity);
WindD->save(WinD);
WindS->save(_windSpd);
Vbat->save(measuredvbat);
Pressure->save(pressure);
pwm.writeMicroseconds(RudderWinch, 2500);
delay(9000);
pwm.writeMicroseconds(RudderWinch, 1400);
t = now.minute();
}
}
int readWindSpd() {
unsigned char i;
long spd = 14920; // one turn = 1.492 miles per hour
spd *= _anemometerCounter;
spd /= 10000;
_anemometerCounter = 0;
return (int) spd;
}
void countAnemometer() {
if ((long)(micros() - last_micros_an) >= DEBOUNCE_TIME * 1000) {
_anemometerCounter++;
last_micros_an = micros();
}
}
// visit io.adafruit.com if you need to create an account,
// or if you need your Adafruit IO key.
#define IO_USERNAME "JohnnyRealName"
#define IO_KEY "Secret"
#define WIFI_SSID "Wifi"
#define WIFI_PASS "SuperSecret"
#define USE_AIRLIFT
#include "AdafruitIO_WiFi.h"
#if defined(USE_AIRLIFT) || defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) || \
defined(ADAFRUIT_PYPORTAL)
// Configure the pins used for the ESP32 connection
#if !defined(SPIWIFI_SS) // if the wifi definition isnt in the board variant
// Don't change the names of these #define's! they match the variant ones
#define SPIWIFI SPI
#define SPIWIFI_SS 13 // Chip select pin
#define NINA_ACK 11 // a.k.a BUSY or READY pin
#define NINA_RESETN 12 // Reset pin
#define NINA_GPIO0 -1 // Not connected
#endif
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS, SPIWIFI_SS,
NINA_ACK, NINA_RESETN, NINA_GPIO0, &SPIWIFI);
#else
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
#endif
It would seem as though I need a way to reactivate the AirLift. The code goes through once and then stops. Although, it does save that one string to the SD card, so there's some progress.