Help me write the program

#include <Shifty.h>
#include <Servo.h>

#define t 7
#define e 10
#define led 1

Shifty shift;
Servo servo;
static int value;

int sound = A1;
int led_fade[3] = { 9, 6, 5 };  //led fade pin settings
int sound_cnt = 0;
int num[22];
void setup() {
  // put your setup code here, to run once:
  shift.setBitCount(25);
  shift.setPins(11, 12, 8);
  pinMode(led, OUTPUT);
  for (int i = 0; i < 4; i++)
    pinMode(led_fade[i], OUTPUT);

  pinMode(t, OUTPUT);
  pinMode(e, INPUT);

  servo.attach(2);
}

void loop() {
  randomSeed(analogRead(0));
  value = analogRead(A1);
  if (value >= 25) {
    sound_cnt++;
  }
  if (sound_cnt == 5)
    sound_cnt = 0;
  digitalWrite(led, HIGH);

  digitalWrite(t, LOW);
  delayMicroseconds(2);
  digitalWrite(t, HIGH);
  delayMicroseconds(2);
  digitalWrite(t, LOW);
  delayMicroseconds(10);

  int dis = pulseIn(e, HIGH) * 340 / 2 / 10000;

  for (int i = 0; i < 22; i++) {
    num[i] = (random(100) % 22) + 1;
    for (int j = 0; j < i; j++) {
      if (num[i] == num[j]) {
        i--;
        break;
      }
    }
  }

  if (dis <= 20) {
    switch (sound_cnt) {
      case 1:
        for (int i = 0; i < 22; i++) {
          shift.writeBit(i, HIGH);
          digitalWrite(led_fade[i], HIGH);
        }
        delay(100);
        break;

      case 2:
        for (int i = 0; i < 30; i++) {
          analogWrite(led_fade[i], i * 8);
          shift.writeBit(i, HIGH);
          shift.writeBit(i - 7, LOW);
          delay(100);
        }
        break;

      case 3:
        for (int i = 0; i < 4; i++) {
          digitalWrite(led_fade[i], HIGH);
        }
        for (int i = 0; i < 22; i++) {
          shift.writeBit(i, HIGH);
          delay(100);
        }
        for (int i = 45; i < 136; i++) {
          servo.write(i);
          delay(10);
        }

        for (int i = 136; i > 45; i--) {
          servo.write(i);
          delay(10);
        }
        for (int i = 0; i < 22; i++) {
          shift.writeBit(i, LOW);
          delay(100);
        }
        break;
      case 4:
        for (int i = 0; i < 22; i++) {
          if (sound_cnt != 4)
            break;
          shift.writeBit(i, HIGH);
          digitalWrite(led_fade[i], HIGH);
        }
        for (int i = 0; i < 22; i++) {
          shift.writeBit(num[i], LOW);
          delay(100);
        }
        for (int i = 0; i < 4; i++) {
          digitalWrite(led_fade[i], LOW);
        }
        for (int i = 0; i < 255; i++) {
          analogWrite(led_fade[0], i);
          analogWrite(led_fade[1], i);
          analogWrite(led_fade[2], i);
          delay(5);
        }
        for (int i = 255; i > 0; i--) {
          analogWrite(led_fade[0], i);
          analogWrite(led_fade[1], i);
          analogWrite(led_fade[2], i);
          delay(5);
        }
        break;
    }
  }
}

I'm making a code that makes the led pattern different depending on the value entered by the sound sensor. What I want to make is to get the sound input while each case is running and if that value is greater than 25, stop the code that is going on and move on to the next pattern. I don't know how to programing this.

To achieve this you need get rid all delays from the code.

Now your led cases are blocking, the controller can't do anything else while case is running. Your code need to be completely rewritten. See the "blink without delay" tutorial.

Calling randomSeed(analogRead(0)); from any function (for example, setup() or loop() or myFunction()) will not break your program, but you only need to call it one time to make it work, so it is usually called from setup()

void setup() {
  randomSeed(analogRead(0));
}
void loop() {
 // your program
}

In the line of code with pulseIn()

pulseIn(e, HIGH) * 340 / 2 / 10000

The timeout (in microseconds) is out of place (pulseIn(e, HIGH, timeout);) and equals 0.017...

Maybe you were looking for a 1.7 seconds timeout =340 / 2 * 10000?

pulseIn(e, HIGH, 340 / 2 * 10000)

Isn't that the range (TOF converted to metres, divided by 2) calculation?

Okay. Distance = "dis" timeout (default 1000ms) * 0.17... i was thinking they were trying to set the timeout.

I applied your feedback :upside_down_face:
Does this code now reflect sound sensor values in all time?

#include <Servo.h>
#include <Shifty.h>

#define led_moon 1
#define t 7
#define e 10
Servo servo;
Shifty shift;
class LED {
  int ledPin;
  int brightn;
  int temp;

  unsigned long previousMillis = 0;

public:
  LED(int pin) {

    ledPin = pin;
    pinMode(ledPin, OUTPUT);
    brightn = random(20, 50);
    temp = brightn;
    previousMillis = 0;
  }

  void Update() {
    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= 15) {
      previousMillis = currentMillis;

      if ((brightn > 255) || (brightn < 0))
        temp *= -1;
      brightn = brightn + temp;
      analogWrite(ledPin, brightn);
    }
  }
};

int temp = 1;
int angle = 45;
unsigned long angle_p_Millis = 0;

void servo_angle() {
  unsigned long angle_c_Millis = millis();
  if (angle_c_Millis - angle_p_Millis >= 15) {
    angle_p_Millis = angle_c_Millis;
    if ((angle >= 135) || (angle <= 45))
      temp *= -1;
    angle += temp;
    servo.write(angle);
  }
}

LED led1(9);
LED led2(6);
LED led3(5);

static int pattern;
static int led;
int sound = A1;
int value = 0;
int temp1 = 1;
int num[22];
int led_cnt = 0;

int state = LOW;

void setup() {
  // put your setup code here, to run once:
  pinMode(t, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(led_moon, OUTPUT);
  pinMode(sound, INPUT);
  shift.setBitCount(25);
  shift.setPins(11, 12, 8);
}

void loop() {
  unsigned long time_a = millis();
  unsigned long time_b = 0;
  int dis = pulseIn(e, HIGH) * 340 / 2 / 10000;
  
  value = analogRead(A1);

  if (value >= 25)
    pattern++;

  pattern %= 3;

  for (int i = 0; i < 22; i++) {
    num[i] = (random(100) % 22) + 1;
    for (int j = 0; j < i; j++) {
      if (num[i] == num[j]) {
        i--;
        break;
      }
    }
  }

  digitalWrite(led_moon, HIGH);
  if (dis <= 50) {
    servo_angle();
    led1.Update();
    led2.Update();
    led3.Update();

    switch (pattern) {
      case 0:
        for (int i = 0; i < 22; i++) {
          shift.writeBit(i, HIGH);
        }
      case 1:
        if (time_a - time_b >= 100) {
          time_b = time_a;
          shift.writeBit(led, HIGH);
          shift.writeBit(led - 5, LOW);
          led++;
          led = led % 26;
        }
      case 2:
        if (time_a - time_b >= 100) {
          time_b = time_a;
          shift.writeBit(num[led_cnt], state);
          led_cnt++;
          led_cnt = led_cnt % 22;
          if ((led_cnt == 21) && (state == LOW))
            state = HIGH;
          else if ((led_cnt == 21) && (state == HIGH))
            state = LOW;
        }
    }
  }
  else{
    for(int i=0;i<22;i++){
      shift.writeBit(i,LOW);
      digitalWrite(i,LOW);
      servo.write(90);
    }
  }
}

Pin 'e' is an output.
Can you explain what is going on here?

it's my mistake. have to revise it Input

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