Installing arduino nano code on arduino WIFI MKR1010

Hi guys

I'm not very good with programming so i asked for your help.

I found on internet a code and relative project for automatic cat feeder.
The problem is (for me) that i have an arduino MKR 1010 and i'm unable to understand whitch mod i need to make on the code.

Can someone help me?

#include <Servo.h>
Servo servo_mot;  

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 5
Adafruit_SSD1306 display(OLED_RESET);

#include <DS3231.h>                             //Download here: https://electronoobs.com/eng_arduino_ds3231.php  
// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);
Time  t;

#include <EEPROM.h>

//Inputs/Outputs
int but1 = 2;
int but2 = 5;
int but3 = 4;
int servo_pin = 9;
int Buzzer = 6;

//Variables
bool state_but1 = true;
bool state_but2 = true;
bool state_but3 = true;
int stop_angle = 92;                //Please test values around 90 till the motor is not rotating anymore
int rotate_angle = 180;
int portions = 5;
int interval = 8;
unsigned int millis_before = 0;     //We use these to create the loop refresh rate
unsigned int millis_now = 0;
int OLED_refresh_rate = 200;
int max_portions = 20;
int min_portions = 3;
int Hour, Minute;
int last_feed_hour = 1;
int next_feed_hour = 1;
bool feed_active = true;
int portion_delay = 500;


void setup() {
  pinMode(but1, INPUT_PULLUP);
  pinMode(but2, INPUT_PULLUP);
  pinMode(but3, INPUT_PULLUP);
  servo_mot.attach(servo_pin);  
  servo_mot.write(stop_angle);
  pinMode(Buzzer, OUTPUT);
  digitalWrite(Buzzer, LOW);
  Serial.begin(9600);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  delay(100);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.display();

  rtc.begin();
  //rtc.setDOW(TUESDAY);            // Set Day-of-Week to SUNDAY
  //rtc.setTime(18, 03, 0);         // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(2, 11, 2021);       // Set the date to January 1st, 2014
 
  
  last_feed_hour = EEPROM.read(2);  //We store the last feeding hour on address 2
  next_feed_hour = EEPROM.read(3);  //We store the next feeding hour on address 3
  
  millis_before = millis();
  millis_now = millis();
}

void loop() {  
  millis_now = millis();                                  //Get actual millis values each loop
  if(millis_now - millis_before > OLED_refresh_rate){     //Refresh rate of the OLED
    millis_before = millis();                             //Save "before value" for next loop
    display.clearDisplay();   
    display.setCursor(0,0);    
    display.print(portions); 
    display.print(" portions"); 
   
    display.setCursor(90,9);
    display.print(Hour); 
    display.print(":"); 
    display.print(Minute); 
   
    display.setCursor(0,16);
    display.print("Each "); 
    display.print(interval); 
    display.print(" hours"); 
    display.display(); 
  }


  t = rtc.getTime();                          //Get time from DS3232
  Hour = t.hour;                              //Get the hour in 0h-23h format
  Minute = t.min;                             //Get minute as well just in case
  Serial.println(Hour);                       //Print hour for debug

  if(Hour == next_feed_hour){                 //If the time is the "next_feed_hour",we activate feeding
    feed_active = true;
    last_feed_hour = Hour;
    next_feed_hour = Hour + interval;         //Increase next feeding time by the interval
    if(next_feed_hour >= 23){                 //if we pass 23 hours, we start back at 00 hours
      next_feed_hour = next_feed_hour - 24;   //That's why we substract 24 hours which is maximum
    }
    EEPROM.write(2, last_feed_hour);          //Write on memory when was the last feeding
    EEPROM.write(3, next_feed_hour);          //Also when will be the next feeding process
    analogWrite(Buzzer, 200);
    delay(200);
    digitalWrite(Buzzer, LOW);
  }

 
  if(feed_active){                            //If this is activem we rotate the motor
    int i = 0;
    while(i<portions){                        //Rotate the motor according to the portions value
      servo_mot.write(rotate_angle);          //START the motor
      i++;
      display.clearDisplay();   
      display.setCursor(48,11);      
      display.print("FEEDING");    
      display.display();      
      delay(portion_delay);                   //Delay for each portion is milliseconds
    }
    servo_mot.write(stop_angle);              //STOP the motor
    feed_active = false;                      //Set "feed_active" back to false
  }

  /////////////////////////////////
  //Button1 (increase portions)   
  if(!digitalRead(but1) && state_but1){
    portions++;
    if(portions > max_portions){          //Where "max_portions" is set above
      portions = min_portions;
    }
    state_but1 = false;
  }
  else if(digitalRead(but1) && !state_but1){
    state_but1 = true;
  }
  
  /////////////////////////////////
  //Button2 (Manual feed) 
  if(!digitalRead(but2) && state_but2){    
    EEPROM.write(2, Hour);
    
    next_feed_hour = Hour + interval;
    if(next_feed_hour >= 23){
      next_feed_hour = next_feed_hour - 24;
    }    
    EEPROM.write(3, next_feed_hour);
    
    feed_active = true;
    state_but2 = false;
  }
  else if(digitalRead(but2) && !state_but2){
    state_but2 = true;
  }

  /////////////////////////////////
  //Button3 (increase time inteval 0h.23h)
  if(!digitalRead(but3) && state_but3){
    interval++;
    if(interval > 23){
      interval = 1;
    }
    state_but3 = false;
  }
  else if(digitalRead(but3) && !state_but3){
    state_but3 = true;
  }  
}//End of void loop

One obvious problem is that the MKR 1010 pins operate at 3.3 V rather than the 5V of the classic Nano. What voltage do your peripherals use, particularly their output voltage ?

5V.
Anyway i will use a buck convert for the peripherals (GND and 5V). On the MKR i will take only the data pin

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.