#include <AccelStepper.h>
#include <ArduinoJson.h>
const int dirPin = 2;
const int stepPin = 3;
#define motorInterfaceType 1
int k2=0;
AccelStepper s(motorInterfaceType, stepPin, dirPin); //search motor
AccelStepper myStepper1(motorInterfaceType, 5, 4); // base motor
const int no_of_containers=10;
const int no_of_time_slots=9;
int k1=no_of_containers;
void dispense_pill(int pills[],int number_of_pills);
int pill_cont(int pill_no);
int searchForPill();
int retract();
char jso[]="{\"data\":[[0, 0, 1, 0, 0, 0, 2, 1, 1, 1], [0, 1, 0, 0, 0, 1, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1, 1, 0], [1, 1, 0, 1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 0, 0, 0, 1, 0, 1], [1, 1, 0, 1, 1, 0, 0, 0, 0, 1], [0, 1, 0, 1, 1, 1, 1, 0, 1, 0],[0],[0, 1, 0, 1, 1, 0, 1, 1, 0, 0]]}";
void setup() {
Serial.begin(9600);
myStepper1.setMaxSpeed(1000);
myStepper1.setAcceleration(100);
myStepper1.setSpeed(200);
s.setMaxSpeed(1000);
s.setAcceleration(100);
s.setSpeed(200);
}
void loop() {
char jso[]="{\"data\":[[0, 0, 1, 0, 0, 0, 2, 1, 1, 1], [0, 1, 0, 0, 0, 1, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1, 1, 0], [1, 1, 0, 1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 0, 0, 0, 1, 0, 1], [1, 1, 0, 1, 1, 0, 0, 0, 0, 1], [0, 1, 0, 1, 1, 1, 1, 0, 1, 0],[0],[0, 1, 0, 1, 1, 0, 1, 1, 0, 0]]}";
DynamicJsonDocument doc(1024);
deserializeJson(doc, jso);
int arr[no_of_time_slots][no_of_containers];
copyArray(doc["data"],arr);
//User user1;
//int k[];
pills_out(arr);
}
int pill_cont(int pill_no){
//Serial.println("pill_mno");
Serial.println(pill_no);
Serial.println("in function: pill_cont");
myStepper1.moveTo(pill_no*k1);
myStepper1.run();
//Serial.println("current position::");
//Serial.println(myStepper1.currentPosition());
if (myStepper1.currentPosition()==pill_no*k1) {return 1;}
else return 0;
}
int searchForPill(){
Serial.println("in SearchForPill");
s.moveTo(500);
s.run();
if(s.currentPosition()%100==0){ delay(100);}
if(digitalRead(10)==HIGH){
s.stop();
int p=retract();
if (p==0){
return 0;
}
}
return 1;
}
int retract(){
s.moveTo(0);
if(s.currentPosition()<=0){s.setSpeed(0);}
else if (s.currentPosition()>0)
{
s.setSpeed(-100);
}
s.run();
if(s.currentPosition()==0){
return 0;
}
return 1;
}
void dispense_pill(int pills[],int number_of_pills){
int k2=0;
while(k2<number_of_pills){
//Serial.println("in function: loop");
//Serial.println("calling pill_cont");
int l=pill_cont(pills[k2]);
Serial.println("l:");
Serial.println(l);
if (l==1)
{
int a=searchForPill();
if (a==0)
{
k2++;
delay(1000);
}
}
}
}
int accumulate(int arr[no_of_containers]) {
int k=0;
for(int i=0;i<no_of_containers;i++){
k+=arr[i];
}
return k;
}
void create_array(int a[no_of_containers],int* b){
int q=0;
for(int h=0;h<no_of_containers;h++){
for(int p=0;p<a[h];p++){
*(b+q)=h;
q++;
}
}
}
int* produce_array(int arr[no_of_time_slots][no_of_containers],int p,int* k){
int to_dis;
to_dis=accumulate(arr[p]);
*k=to_dis;
int* array_to_dis= new int[to_dis];
create_array(arr[p],array_to_dis);
Serial.println("time slot:");
Serial.println(p);
Serial.println("no_of_pills");
Serial.println(to_dis);
Serial.println(" ");
for(int l=0;l<to_dis;l++){
Serial.print(array_to_dis[l]);
}
Serial.println("");
return array_to_dis;
}
void pills_out(int arr[no_of_time_slots][no_of_containers]){
for(int p=0;p<no_of_time_slots;p++){
int* size;
int* tata=produce_array(arr,p,size);
int l=*size;
int pills_to_be[l];
int complete_array[2*l];
for(int c=0;c<l;c++){
pills_to_be[c]=tata[c];
}
for(int i=0;i<l;i++){
Serial.print(pills_to_be[i]);
}
Serial.println(" ");
complete_array[0]=pills_to_be[0];
for(int z=0;z<2*l;z++){
if(z%2==0){
complete_array[z]=pills_to_be[z/2];
}
else{
if(complete_array[z-1]<4) complete_array[z]=0;
else complete_array[z]=10;
}
}
for(int i=0;i<2*l;i++){
Serial.print(complete_array[i]);
}
Serial.println(" ");
dispense_pill(complete_array,2*l);
Serial.println("time1 over");
delay(100);//replace with rtc for the new thingy
delete[] tata;
}
/*int num_pi=5;
int pills[]={1,3,2,5,4};*/
Serial.println("over");
}