***************CODE***************
#include <Arduino_LSM6DS3.h>
#include <SAMD21turboPWM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <WiFiNINA.h>
#include <avr/dtostrf.h>
#define ONE_WIRE_BUS 21//temp
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define DEVICE_LABEL "arduino-nano-33"
#define TOKEN "BBFF-wKTuRwsXszVQuGUMJvEUcQIuz0xNtq"
char const * VARIABLE_LABEL_2 = "seti";
char const * VARIABLE_LABEL_3 = "T_di";
char const * VARIABLE_LABEL_9 = "seto";
char const * VARIABLE_LABEL_10 = "T_ana";
char const * VARIABLE_LABEL_16 = "x";
char const * VARIABLE_LABEL_17 = "y";
char const * VARIABLE_LABEL_18 = "z";
char const * VARIABLE_LABEL_19 = "gx";
char const * VARIABLE_LABEL_20 = "gy";
char const * VARIABLE_LABEL_21 = "gz";
char const *SERVER="things.ubidots.com";
//Replace the above line if you are an Educational user char const *SERVER="things.ubidots.com";
const int HTTPPORT= 443;
char const *AGENT="Arduino Nano 33 IoT";
char const *HTTP_VERSION = " HTTP/1.1\r\n";
char const *VERSION ="1.0";
char const *PATH= "/api/v1.6/devices/";
char const * SSID_NAME = "Sid"; // Put here your SSID name
char const * SSID_PASS = "9639554688sid"; // Put here your password
int status = WL_IDLE_STATUS;
//Pins
int PWM_pin = 5;//TEC PWM timer0
int PWMF_pin=8;//FAN PWM timer2
//l298n_tec
#define in1 4
#define in2 6
//FAN
#define in3 7//change
#define in4 9//change
/*-------------------------------------------------*/
//Variables for TEC
//float tempdigi;
//Start temp digi
float Init_temp=32;
float tempdigi;
float set_temperature = 15;
float PID_error = 0;
float previous_error = 0;
float elapsedTime, Time, timePrev;
int PID_value = 0;
#define pwm_factor 1
int pwmtec;
//Variables for FAN
//Start temp digi
float temp_analog;
float setF_temperature = 32 ;//room temp if rise activate PID_FAN
float PIDF_error = 0;
float previousF_error = 0;
float elapsedTimeF, TimeF, timePrevF;
int PIDF_value = 0;
#define pwmF_factor 231
int pwmfan;
TurboPWM pwmF;
TurboPWM pwmT;
//PID constants for TEC
float kp =950/*120 0.4*/; float ki =0.01 /*0.05*/; float kd = 0;
int PID_p = 0; float PID_i = 0; int PID_d = 0;
//PID constants for FAN
float Fkp = 300/*235*/; float Fki =1; float Fkd =0;
int PIDF_p = 0; float PIDF_i = 0; int PIDF_d = 0;
//analog type thermistor
int Vo;
float R1 = 10000; // value of R1 on board
float logR2, R2;
float c1 = 0.001129148, c2 = 0.000234125, c3 = 0.0000000876741; //steinhart-hart coeficients for thermistor
//---- 4 acc & gyrpo--------------
float x, y, z,gx, gy, gz;
WiFiSSLClient client;
void printWiFiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
void getResponseServer() {
Serial.println(F("\nUbidots' Server response:\n"));
while (client.available()) {
char c = client.read();
// Serial.print(c); // Uncomment this line to visualize the response on the Serial Monitor
}
}
void waitServer() {
int timeout = 0;
while (!client.available() && timeout < 5000) {
timeout++;
delay(1);
if (timeout >= 5000) {
Serial.println(F("Error, max timeout reached"));
break;
}
}
}
void sendData(char* payload) {
int contentLength = strlen(payload);
/* Connecting the client */
if (client.connect(SERVER, HTTPPORT)) {
Serial.println("connected to server");
client.print(F("POST "));
client.print(PATH);
client.print(DEVICE_LABEL);
client.print(F("/"));
client.print(HTTP_VERSION);
client.print(F("Host: "));
client.print(SERVER);
client.print(F("\r\n"));
client.print(F("User-Agent: "));
client.print(AGENT);
client.print(F("\r\n"));
client.print(F("X-Auth-Token: "));
client.print(TOKEN);
client.print(F("\r\n"));
client.print(F("Connection: close\r\n"));
client.print(F("Content-Type: application/json\r\n"));
client.print(F("Content-Length: "));
client.print(contentLength);
client.print(F("\r\n\r\n"));
client.print(payload);
client.print(F("\r\n"));
Serial.print(F("POST "));
Serial.print(PATH);
Serial.print(DEVICE_LABEL);
Serial.print(F("/"));
Serial.print(HTTP_VERSION);
Serial.print(F("Host: "));
Serial.print(SERVER);
Serial.print(F("\r\n"));
Serial.print(F("User-Agent: "));
Serial.print(AGENT);
Serial.print(F("\r\n"));
Serial.print(F("X-Auth-Token: "));
Serial.print(TOKEN);
Serial.print(F("\r\n"));
Serial.print(F("Connection: close\r\n"));
Serial.print(F("Content-Type: application/json\r\n"));
Serial.print(F("Content-Length: "));
Serial.print(contentLength);
Serial.print(F("\r\n\r\n"));
Serial.print(payload);
Serial.print(F("\r\n"));
waitServer();
getResponseServer();
}
/* Disconnecting the client */
client.stop();
}
//acc & gyro
void AGinit(void)
{
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Acceleration in G's");
Serial.println("X\tY\tZ");
Serial.print("Gyroscope sample rate = ");
Serial.print(IMU.gyroscopeSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Gyroscope in degrees/second");
Serial.println("Gx\tGy\tGz");
}
void AG_loop(void){
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
}
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(gx, gy, gz);
}
}
void PID_FAN(void)
{
outemp();
PIDF_error = temp_analog-setF_temperature ;//error b/w ST n CT
PIDF_p = Fkp * PIDF_error;// P value
if((PIDF_error <4)&&(PIDF_error >0))//I in a range
{
PIDF_i = PIDF_i + (Fki * PIDF_error);
if(!((-20<PIDF_i)&&(PIDF_i<100)))PIDF_i=0;
}
//derivative-real time: speed change rate
timePrevF = TimeF; // pre time str
TimeF = millis(); // actual time read
elapsedTimeF = (TimeF - timePrevF) / 1000;
//D Value
PIDF_d = Fkd*((PIDF_error - previousF_error)/elapsedTimeF);
PIDF_value = PIDF_p + PIDF_i + PIDF_d;// P + I + D
//PWM b/w 0 and 1200
if(PIDF_value < 900)
{ PIDF_value =900 ;
}
if(PIDF_value > 1200)
{
PIDF_value = 1200;
}
pwmF.analogWrite(PWMF_pin,PIDF_value);
previousF_error = PIDF_error; //Remember to store the previous error for next loop.
}
void PID_TEC(void){
Innertemp();
previous_error = PID_error; //Remember to store the previous error for next loop.
PID_error =tempdigi-set_temperature ;//error b/w ST n CT
PID_p = kp * PID_error;// P value
if((PID_error <1.5)&&(PID_error >0))//I in a range
{
PID_i = PID_i + (ki * PID_error);
if(!((-10<PID_i)&&(PID_i<10)))PID_i=0;
}
//derivative-real time: speed change rate
timePrev = Time; // pre time str
Time = millis(); // actual time read
elapsedTime = (Time - timePrev) / 1000;
//D Value
PID_d = kd*((PID_error - previous_error)/elapsedTime);
PID_value = PID_p + PID_i + PID_d;// P + I + D
//PWM b/w 0 and 1200
if(PID_value < 0)
{
PID_value = 0;
}
if(PID_value > 1200)
{ PID_value = 1200;
}
pwmT.analogWrite(PWM_pin,PID_value);
previous_error = PID_error; //Remember to store the previous error for next loop.
// p=255-PID_value;
}
//digital_temp
void Innertemp(void)
{
//inside temp
sensors.requestTemperatures();
tempdigi = sensors.getTempCByIndex(0);
}
//analog_temp
void outemp(void)
{
Vo = analogRead(0);
R2 = R1 * (1023.0 / (float)Vo - 1.0); //calculate resistance on thermistor
logR2 = log(R2);
temp_analog = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); // temperature in Kelvin
temp_analog = temp_analog - 273.15; //convert Kelvin to Celcius
}
void wifi_init(void)
{
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(SSID_NAME);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(SSID_NAME, SSID_PASS);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to wifi");
printWiFiStatus();
}
void wifi_main(void)
{
char payload[600];
//Init_temp
char str_val_1[30];
//set_temperature
//tempdigi
char str_val_2[30];
char str_val_3[30];
/*
PID_error
PID_p
PID_i
PID_d
PID_value
*/
char str_val_4[30];
char str_val_5[30];
char str_val_6[30];
char str_val_7[30];
char str_val_8[30];
/*
setF_temperature
temp_analog
*/
char str_val_9[30];
char str_val_10[30];
/*
PIDF_error
PIDF_p
PIDF_i
PIDF_d
PIDF_value
*/
char str_val_11[30];
char str_val_12[30];
char str_val_13[30];
char str_val_14[30];
char str_val_15[30];
/*
x
y
z
*/
char str_val_16[30];
char str_val_17[30];
char str_val_18[30];
/*
gx
gy
gz
*/
char str_val_19[30];
char str_val_20[30];
char str_val_21[30];
/*4 is the total lenght of number,maximun number accepted is 99.99*/
// float value = analogRead(A0);
dtostrf(set_temperature, 4, 2, str_val_2);
dtostrf(tempdigi, 4, 2, str_val_3);
dtostrf(PID_value, 4, 2, str_val_8);
dtostrf(setF_temperature, 4, 2, str_val_9);
dtostrf(temp_analog, 4, 2, str_val_10);
dtostrf(PIDF_value, 4, 2, str_val_15);
dtostrf(x, 4, 2, str_val_16);
dtostrf(y, 4, 2, str_val_17);
dtostrf(z, 4, 2, str_val_18);
dtostrf(gx, 4, 2, str_val_19);
dtostrf(gy, 4, 2, str_val_20);
dtostrf(gz, 4, 2, str_val_21);
sprintf(payload, "{\"");
sprintf(payload, "%s%s\":%s", payload, VARIABLE_LABEL_2, str_val_2);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_3, str_val_3);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_9, str_val_9);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_10, str_val_10);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_16, str_val_16);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_17, str_val_17);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_18, str_val_18);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_19, str_val_19);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_20, str_val_20);
sprintf(payload, "%s,\"%s\":%s", payload, VARIABLE_LABEL_21, str_val_21);
sprintf(payload, "%s}", payload);
//Send the payload to Ubidots
sendData(payload);
delay(100);
}
void setup() {
Serial.begin(9600);
// pinMode(PWM_pin,OUTPUT);
// pinMode(PWMF_pin,OUTPUT);
////fan pwm
pwmF.setClockDivider(1, false); // Main clock divided by 200 => 240KHz
pwmF.timer(2, 2, 1200, false); // Use timer 2 for pin 13, divide clock by 4, resolution 60000, dual-slope PWM
//pwm.analogWrite(11, 500); // PWM frequency is now 0.5Hz, dutycycle is 500 / 1000 * 100% = 50%
////////
///
AGinit();
///
////TEC pwm
pwmT.setClockDivider(1, false); // Main clock divided by 200 => 240KHz
pwmT.timer(0, 2, 1200, false); // Use timer 0 for pin 5, divide clock by 4, resolution 60000, dual-slope PWM
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
digitalWrite(in4, HIGH);
digitalWrite(in3, LOW);
// Start up the library
sensors.begin();
wifi_init();
}
void loop(void)
{
Time = millis(); //Number of milliseconds passed since the program started
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in4, HIGH);
digitalWrite(in3, LOW);
PID_TEC();
PID_FAN();
AG_loop();
wifi_main();
}
Top Comments